【发布时间】: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