【问题标题】:Unable to compile STL with templates无法使用模板编译 STL
【发布时间】:2011-02-13 01:30:49
【问题描述】:

我在尝试编译这个模板时遇到了一些问题,我认为问题出在 Edge 类上,我在添加它之前很高兴地编译了它。

首先,这应该对加权连通图进行建模。每个图都有一个图,它包含系统中所有节点的集合,每个节点都是一个模板,它保存类型 T 的节点值(我已经用 int 和 char 测试过)和一个边列表,边是与其他节点的连接,并具有权重和指向其他节点的指针。

当我只有一个节点列表(在图中)时,它编译得很好,一切都很好。然后当我添加 Edges 部分时,它就无法编译。会不会是模板不喜欢 1 指代一个反过来又指向的模板?

我收到以下错误:(还有一些其他错误,但我确信它们只是错误结转)

C4430:缺少类型说明符 - int 假定。注意:C++ 不支持 default-int edge.cpp 12

错误 C2974:“std::list”:无效 '_Ty' 的模板参数,类型 预期 node.cpp 13

错误 C2065:“边缘”:未声明 标识符 node.cpp 13

任何帮助将不胜感激,如果有更多信息我可以提供,请询问。

#ifndef GRAPH_CPP
#define GRAPH_CPP

#include "Node.cpp"
#include <list>

using namespace std;

template <typename T>
class Graph
{
private:
    list< Node<T>* > nodes;
    //bool (*compare) (T, T);
public:
    Graph(){}
    void addNodes(T nNode)
    {
        nodes.push_back( new Node<T>( nNode ) );
    }
};
#endif


#ifndef NODE_CPP
#define NODE_CPP

#include <vector>
#include "Edge.cpp"

using namespace std;

template <typename T>
class Node
{
private:
    list< Edge < T > > adjacencies;
    T value;
public:
    Node(T nVal)
    {
        value = nVal;
    }
    T getValue()
    {
        return value;
    }
};
#endif //NODE_CPP


#ifndef EDGE_CPP
#define EDGE_CPP

#include "Node.cpp"

template <typename T>
class Edge
{
private:
    Node<T>* node;
public:
    Edge(){}
};

#endif

【问题讨论】:

  • 您确定要包含 .cpp 文件吗?
  • 你是如何实例化一切的?
  • 你永远不应该包含 cpp 文件...包含头文件...
  • #include .cpp 文件在技术上没有任何问题,只要它们不包含在您的构建中进行编译,但这是非常不寻常的,并且显然令人困惑。
  • 不要using namespace std; 放在头文件的全局命名空间中。 不要在头文件中包含实现文件,比如你的 #include "Node.cpp" 不要那样做。 不要调用头文件 [something.cpp]。

标签: c++ templates visual-c++ list stl


【解决方案1】:

我认为 Edge 的前向声明会在你的 Node 声明之前解决这个问题。

template <typename T>
class Edge;

您可能需要对带有 Node 的 Edge 执行相同的操作。

【讨论】:

  • 是的。您可能需要在 Edge 文件中执行相同的操作。
  • 你好,谢谢你的回答我只是想试试,这会写在Node文件中吗?就像在 C 中指定函数一样?
  • 是的。但是您应该按照许多 cmets 的建议进行操作,并将您的文件重命名为 .h(标头)文件。您还应该按照他们的建议做,而不是使用 using namespace std;
  • 如果在非内联示例中,我应该在头文件或源文件中声明类。声明我在每个源文件中使用的所有类也是一种好习惯,无论编译器是否可以解决它?再次感谢
  • 是的,你在头文件中声明了类。然后在cpp(实现文件)中声明非内联/模板方法。
【解决方案2】:

Node 和 Edge 紧密耦合。 Edge 可能首先应该是“完整的”,因为 Node 有 list&lt;Edge&gt;,所以我不确定 Edge 是否可以在那时提前声明。 Edge 有 Node *,所以它绝对可以。

template< typename T > class Node;

template< typename T > class Edge
{
 // define
};

template< typename T> class Node
{
 // define
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多