无法使用模板编译STL

时间:2011-02-13 01:30:50

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

我在尝试使用此模板进行编译时遇到一些问题,我认为问题出在Edge类上,在添加之前我很乐意编译。

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

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

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

  

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

     

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

     

错误C2065:'Edge':未声明   标识符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

2 个答案:

答案 0 :(得分:0)

我认为Edge的前向声明会在你的Node声明之前修复它。

template <typename T>
class Edge;

您可能需要为Edge with Node做同样的事情。

答案 1 :(得分:0)

Node和Edge紧密耦合。边缘应该首先“完整”,因为Node有list<Edge>因此我不确定Edge是否可以在此时向前声明。 Edge有Node *所以肯定可以。

template< typename T > class Node;

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

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