2012-05-15 70 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)没有这类消息的错误。谢谢。 –