2012-05-15 5 views
3

Я столкнулся с круговой зависимостью в своей программе и решил ее с помощью указателей и передовых объявлений. Для этой цели я сделал файл dn.hpp. Все было нормально, пока я не перешел к общим указателям вместо родовых. Я создал typedefs для общих указателей в dn.hpp. Все работает с общими указателями (закомментировано), булочкой не с общим.Циклическая зависимость с общими указателями

возвращает ошибку: поле «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). Спасибо. –

Смежные вопросы