使用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类型似乎是有原因的......
答案 0 :(得分:7)
BGL中有一个没有很好记录的traits类,它为adjacency_list
图提供了顶点和边描述符类型,而无需知道属性类型。它专为您的用例而设计。查看http://www.boost.org/doc/libs/1_45_0/libs/graph/doc/adjacency_list.html的“关联类型”部分,注意vertex_descriptor
和edge_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对象存储为指针而不是真实对象?我首先尝试了这个,但编译器抱怨构造。而且我也想知道是否有办法避免额外的内存消耗。当我的图表变得足够大时,这可能最终变得相关。