3

我在使用 Boost 图形库的邻接列表时遇到问题。这似乎是一个循环依赖问题:我有一个模板的 typedef T,它使用了某个类 A。另外,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

4 回答 4

7

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

于 2011-01-21T06:03:04.650 回答
0

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

于 2010-11-20T11:50:39.380 回答
0

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

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

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

于 2010-11-20T18:05:10.380 回答
0

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

那我做了什么?我把我的 Lane-class 改成这样:

//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。我想知道的是:是否也可以将 LaneSide 对象存储在 Lane-class 内部,而不是作为指针,而是作为真实对象?我首先尝试了这个,但编译器抱怨构造。而且我还想知道是否有办法避免额外的内存消耗。当我的图表变得足够大时,这可能最终变得相关。

于 2010-11-20T20:07:51.050 回答