如何解决Boost :: BGL模板< - >类循环依赖?

时间:2010-11-20 11:13:23

标签: c++ templates forward-declaration circular-dependency boost-graph

使用Boost图形库的邻接列表时遇到问题。这似乎是循环依赖问题: 我有一个模板的typedef T,它使用了一些类A.另外一个存储指向类型为T的对象的指针。现在编译器告诉我,T没有命名一个类型。

以下是我更具体文件的摘录:

//graphdefinitions.hpp
#include "lane.hpp"
#include "tie.hpp"

typedef boost::adjacency_list<boost::listS, boost::listS, 
                              boost::directedS, Tie, Lane> Map;
typedef boost::graph_traits<Map>::edge_descriptor edge_descriptor;

//lane.hpp
#include "graphdefinitions.hpp"
class Lane {
    ...
    edge_descriptor *left, *right;
};

//tie.hpp
//no important includes here
class Tie {
    ...
};

如何解决此依赖/包含顺序问题?

另一个编辑: 我只是想到了edge_descriptor的类型可能是像int这样的原始类型。这样就解决了这个问题,因为我可以通过普通的int变量替换Lane的edge_descriptors,因此可以删除tie.hpp中包含graphdefinitions.hpp。不幸的是我的想法很疯狂*我必须找到另一个解决方案。 Edge_descriptor类型似乎是有原因的......

4 个答案:

答案 0 :(得分:7)

BGL中有一个没有很好记录的traits类,它为adjacency_list图提供了顶点和边描述符类型,而无需知道属性类型。它专为您的用例而设计。查看http://www.boost.org/doc/libs/1_45_0/libs/graph/doc/adjacency_list.html的“关联类型”部分,注意vertex_descriptoredge_descriptor有两种定义;您可以在属性包的定义中使用来自adjacency_list_traits的版本,而不会导致循环定义。

答案 1 :(得分:0)

我真的认为你不需要这个代码有什么特别之处。您必须确保声明图中使用的类型的定义(不仅是前向声明的)。

答案 2 :(得分:0)

您已循环包含标题。 Lane包括graphdefinitions,其中包括lane,包括graphdefinitions等。这是你的问题的原因。

编辑:我意识到这已经在OP中提到了。这个问题的解决方案是PIMPL。

编辑:我实际要做的是将typedef放在Lane类中。这应该以最好的方式解决问题。

答案 3 :(得分:0)

@DeadMG:我现在使用类似PIMPL的方法,我认为这解决了我的问题。

那我该怎么办? 我改变了我的Lane类,看起来就是这样:

//lane.hpp
#include "graphdefinitions.hpp"

class LaneSide;
class Lane {
public:
    const LaneSide getLeft() const;
    const LaneSide getRight() const;
    ...
private:
    LaneSide *left;
    LaneSide *right;
    ...
};

而LaneSide类实际上只是一个间接并且保存了我无法在lane.hpp中声明的值的类型,看起来就是这样:

//laneside.hpp
class LaneSide
{
    edge_descriptor* edge;
};

这似乎像我想的那样欺骗编译器。谢谢你提示DeadMG。我想知道:是否也可以将Lane-class内的LaneSide对象存储为指针而不是真实对象?我首先尝试了这个,但编译器抱怨构造。而且我也想知道是否有办法避免额外的内存消耗。当我的图表变得足够大时,这可能最终变得相关。