【发布时间】:2016-10-07 00:51:01
【问题描述】:
我有以下生成无向图的代码:
// --- Header File ---
class Node { ... };
struct Edge { float weight; };
typedef adjacency_list<vecS, vecS, undirectedS, Node, Edge> Grafo;
class MST
{
public:
MST(std::vector<Node> nodes);
Grafo g;
vector<edge_t> build();
};
// --- cpp File ---
MST::MST(std::vector<Node> nodes) { // build the graph by setting vertices and edges... }
vector<edge_t> MST::build()
{
vector<edge_t> mst;
kruskal_minimum_spanning_tree(g, std::back_inserter(mst));
return mst;
}
问题在于我称之为 Kruskal 的那一行:kruskal_minimum_spanning_tree()。如果我评论这一行,它会编译得很好,我可以用 graphviz 导出图表(你可以在webgraphviz.com 看到图表):
graph G {
0[label="a"];
1[label="b"];
2[label="c"];
3[label="d"];
4[label="e"];
0--1 [label=80.4487381];
0--2 [label=406.060333];
0--3 [label=405.738831];
0--4 [label=434.203857];
1--2 [label=25.9422436];
1--3 [label=210.344955];
1--4 [label=246.965591];
2--3 [label=35.805027];
2--4 [label=35.1283379];
3--4 [label=167.5858];
}
但是,如果我尝试使用该行进行编译,我会从 Boost 中得到很多错误(我使用的是 g++ 4.9.2)。第一个错误是:error: forming reference to void typedef value_type& reference;,这个错误重复了好几次。出现的其他错误:
error: no matching function for call to 'get(boost::edge_weight_t, const boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Symbol, Edge>&)'
get(edge_weight, g));
所以我尝试在调用 Kruskal 方法之前添加get(edge_weight, g);,但我得到了注释:
note: types 'boost::subgraph<Graph>' and 'const boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Symbol, Edge>' have incompatible cv-qualifiers
get(edge_weight, g));
和
note: mismatched types 'const boost::two_bit_color_map<IndexMap>' and 'boost::edge_weight_t'
get(edge_weight, g));
我不知道该怎么办。这是我第一次使用 Boost Graph Library。它非常强大,但并不容易理解。
【问题讨论】:
标签: c++ boost boost-graph