应用dijkstra算法时,Boost图库会导致错误

时间:2014-05-23 04:42:08

标签: c++ boost graph dijkstra boost-graph

我一直在松散地关注this examplethis onethis stack overflow post,尝试应用Dijkstra算法来查找两个节点之间最短路径的成本。

如果我尝试按照第一个例子,我会得到error with the typedef statement for NameMap。这个错误很神秘,冗长,而且我不知道如何处理它。

如果我尝试按照第二个例子(从Boost文档中复制粘贴!!)does not compile。这个错误更加神秘和冗长。

第三个(堆栈溢出帖子)依赖于与第一个相同的typedef。

这是用户错误吗?它可能是,但我应该如何解释从库代码中产生的错误消息?

更新1

我正在使用debian测试中的g ++(Debian 4.8.2-21)4.8.2。

更新2

Here是源代码的精简版本,不起作用。有两行以" //开头,以下行导致错误"是有问题的。

更新3 我改变了

typedef adjacency_list<listS, vecS, directedS, allow_parallel_edge_tag, EdgeWeightProperty> Graph;

typedef adjacency_list<listS, vecS, directedS, no_property            , EdgeWeightProperty> Graph;

1 个答案:

答案 0 :(得分:1)

您的第一次尝试没有使用vertex_name_t标记定义属性(或将其作为adjacency_list模板参数传递),因此当您尝试创建property_map时该标记编译器发出错误。

您的代码:

typedef property<edge_weight_t, Weight> EdgeWeightProperty;
typedef boost::adjacency_list<listS, vecS, directedS, allow_parallel_edge_tag, EdgeWeightProperty> Graph;
                                                  //  ^ What's this?

您引用的示例代码:

typedef boost::property<boost::edge_weight_t, Weight> WeightProperty;
typedef boost::property<boost::vertex_name_t, std::string> NameProperty;  // <-- not in your code
typedef boost::adjacency_list < boost::listS, boost::vecS, boost::directedS, NameProperty, WeightProperty > Graph;
                                                                         //  ^ Used here

我不知道您为什么要将allow_parallel_edge_tag作为模板参数传递。如果我正确阅读文档,那么当您使用自定义容器类型时,该结构是为parallel_edge_traits特化设计的。

编辑:一旦你有了代码,第二种情况实际上很容易诊断。通过编译器发出的错误消息,我们查找编译器没有为dijkstra_shortest_paths选择3参数重载的原因。很多消息只是告诉你它拒绝了大约十几个参数的重载 - 应该这样做!

现在,错误消息(由g ++使用Coliru发出)是相关的,因为它告诉您为什么编译器拒绝了三参数版本:

In file included from main.cpp:5:0:
/usr/local/include/boost/graph/dijkstra_shortest_paths.hpp:602:3: note: void boost::
dijkstra_shortest_paths(const VertexListGraph&, typename boost::graph_traits<Graph>::
vertex_descriptor, const boost::bgl_named_params<T, Tag, Base>&) [ /* irrelevant stuff
telling you how it deduced the template parameters here */ ] <near match>
   dijkstra_shortest_paths
   ^
/usr/local/include/boost/graph/dijkstra_shortest_paths.hpp:602:3: note:   no known conversion for
 argument 2 from 'long int [6]' to 'boost::graph_traits<boost::adjacency_list<boost::listS, 
boost::vecS, boost::directedS, boost::no_property, boost::property<boost::edge_weight_t, long int> > 
>::vertex_descriptor {aka long unsigned int}'

您传递s,包含源顶点的数组,作为指定起始顶点的第二个参数,当您应该传递v0时,编译器正在抱怨它无法转换数组渴望到一个顶点。