2012-05-15 122 views
3

我在我的程序中遇到了一個循環依賴,並使用指針和轉發聲明來解決它。爲此我已經爲文件dn.hpp做了一個文件。一切都很好,直到我轉移到共享指針而不是泛型。我在dn.hpp中爲共享指針創建了typedefs。一切工作與通用指針(註釋掉),不包含共享。循環依賴與共享指針

它返回一個錯誤: 場「parentGraph具有不完整的類型node.h線21

(我用的MinGW與提升1.47)

請幫我解決這個問題。

這裏被簡化我的代碼版本:

dn.hpp

// forward declarations 
#include <map> 
#include <list> 
#include <boost/shared_ptr.hpp> 

class graph; 
typedef boost::weak_ptr<graph> graph_wp; 
typedef boost::shared_ptr<graph> graph_sp; 
//typedef graph* graph_wp; 
//typedef graph* graph_sp; 

class node; 
typedef boost::weak_ptr<node> node_wp; 
typedef boost::shared_ptr<node> node_sp; 
//typedef node* node_wp; 
//typedef node* node_sp; 
typedef std::list<node_sp> nodes_t; 

class edge; 
typedef boost::weak_ptr<edge> edge_wp; 
typedef boost::shared_ptr<edge> edge_sp; 
//typedef edge* edge_wp; 
//typedef edge* edge_sp; 
typedef std::list<edge_sp> edges_t; 
typedef std::list<edge_wp> edgeList_t; 

graph.h

#ifndef GRAPH_H_ 
#define GRAPH_H_ 

#include "node.h" 
#include "edge.h" 

#include "dn.hpp" 

class graph 
{ 
public: 
    node* createNode(); 
protected: 
    nodes_t nodes; 
    edges_t edges; 
}; 
#endif /*GRAPH_H_ */ 

node.h

#ifndef NODE_H_ 
#define NODE_H_ 

#include "graph.h" 
#include "edge.h" 

#include "dn.hpp" 

class node 
{ 
public: 
    node(); 
    node(graph_wp n); 
    node(const graph_wp& net); 
    virtual ~node(); 

    edge_wp createChild(); 
protected: 
    graph_wp parentGraph; 
    edgeList_t edges; 
}; 
#endif /* NODE_H_ */ 

edge.h

#ifndef EDGE_H_ 
#define EDGE_H_ 

#include "node.h" 

#include "dn.hpp" 

class edge 
{ 
public: 
    edge(node_wp src,node_wp tgt); 
    virtual ~edge(); 
private: 
    node_sp source; 
    node_sp target; 
}; 
#endif /* EDGE_H_ */ 

的main.cpp

#include "graph.h" 
int main() { 
    graph n; 
    return 0; 
} 
+0

你爲什麼說這是不工作? –

+0

@ Stephen增加了錯誤輸出。 –

+1

無論它對你有什麼價值,你的例子都很長,很難閱讀。如果您將程序縮減爲顯示錯誤的最小完整程序,您將得到更快,更準確的答案。當你將它簡化爲一個簡單的測試用例時,你甚至可以自己解決這個問題。請參閱http://sscce.org/。點擊[這裏](http://ideone.com/PXAsE)查看一個簡短程序的例子,演示您遇到的錯誤。 –

回答

2

當我與VisualStudio的編譯代碼我得到

error C2079: 'node::parentGraph' uses undefined class 'boost::weak_ptr<Y>' 
with 
[ 
    Y=graph 
] 

添加

#include <boost/weak_ptr.hpp> 

修復了這個

+0

是的,它修復了它。戰鬥'weak_ptr'是'shared_ptr'的一部分。至少我的編譯器(gcc 4.7)沒有這類消息的錯誤。謝謝。 –