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

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

我在使用 Boost 图形库的邻接表时遇到问题。这似乎是一个循环依赖问题: 我有一个使用类 A 的模板的 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 类型似乎是有原因的......

最佳答案

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

关于c++ - 如何解决 Boost::BGL 模板<->类循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4232409/

相关文章:

C++ 函数返回对数组的引用

C++ 集合类调用子函数

c++ - 使用模板将语义从一种类型转移到另一种类型

c++ - 带有类类型 vector 的前向声明 - 不允许指向不完整类类型的指针

c++ - 这个前向声明有什么问题

c++ - 串行端口 : bytes from device all have their most significant bit = 0

c++ - reinterpret_cast vs c style cast

c++ - 什么时候可以安全且轻松地将引用变量用作别名?

c++ - 为模板类重载友元运算符<<

c++ - 不完整类型的无效使用(嵌套类案例)