2011-02-13 51 views
0

我有一些問題試圖讓這個模板編譯,我認爲問題是與邊緣類,我愉快地編譯之前,我添加它。無法編譯與模板的STL

首先,這應該是對加權連通圖進行建模。每個圖都有一個圖,它包含了系統中所有節點的集合,每個節點都是一個模板,它保存了類型T的節點值(我已經用int和char測試過)以及邊的列表,邊是到其他節點的連接,並且具有一個權重和另一個節點的指針。

當我只有一個節點列表(圖中)它編譯得很好,一切都很好。然後當我添加了邊緣部分它只是不編譯。難道模板只是不喜歡它,當1指向一個反過來指向的模板?

我收到以下錯誤:(有幾個人,但我相信他們只是錯誤結轉)

C4430:缺少類型說明符 - 詮釋 承擔。注意:C++不支持 默認int edge.cpp 12

錯誤C2974: '的std ::名單':無效 爲 '_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 
+3

您確定要包含.cpp文件嗎? – fredoverflow 2011-02-13 01:35:16

+0

你如何實例化一切? – 2011-02-13 01:35:53

回答

0

我認爲在您的節點聲明之前,Edge的前向聲明將解決此問題。

template <typename T> 
class Edge; 

您可能需要爲Edge with Node做同樣的事情。

0

節點和邊緣緊密耦合。 Edge可能應該是「完整的」,因爲Node有list<Edge>,所以我不確定Edge是否可以在該點處向前聲明。 Edge有Node *,所以它肯定可以。

template< typename T > class Node; 

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

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