【发布时间】:2013-05-30 10:18:25
【问题描述】:
我正在尝试构建一个顶点存储在std::list 而不是std::vector 中的图形。
但是,我对收到的编译错误感到困惑。我使用的最小代码是
#include <boost/graph/adjacency_list.hpp>
using namespace boost;
int main() {
typedef adjacency_list< listS,listS > Graph;
Graph g;
add_edge(0,1,g);
return 0;
}
使用gcc-4.7.3 编译时出现以下错误:
/Users/matteo/Documents/workspace/graph-gravity-dec/src/test.cpp: In function 'int main()':
/Users/matteo/Documents/workspace/graph-gravity-dec/src/test.cpp:12:17: error: invalid conversion from 'int' to 'boost::detail::adj_list_gen<boost::adjacency_list<boost::listS, boost::listS>, boost::listS, boost::listS, boost::directedS, boost::no_property, boost::no_property, boost::no_property, boost::listS>::config::vertex_descriptor {aka void*}' [-fpermissive]
In file included from /opt/local/include/boost/graph/adjacency_list.hpp:246:0,
from /Users/matteo/Documents/workspace/graph-gravity-dec/src/test.cpp:2:
/opt/local/include/boost/graph/detail/adjacency_list.hpp:681:5: error: initializing argument 2 of 'std::pair<typename Config::edge_descriptor, bool> boost::add_edge(typename Config::vertex_descriptor, typename Config::vertex_descriptor, boost::directed_graph_helper<Config>&) [with Config = boost::detail::adj_list_gen<boost::adjacency_list<boost::listS, boost::listS>, boost::listS, boost::listS, boost::directedS, boost::no_property, boost::no_property, boost::no_property, boost::listS>::config; typename Config::edge_descriptor = boost::detail::edge_desc_impl<boost::directed_tag, void*>; typename Config::vertex_descriptor = void*]' [-fpermissive]
这似乎是在抱怨从 int 到 void* 的无效转换。
但是,如果我将 listS 更改为 vecS 一切正常
#include <boost/graph/adjacency_list.hpp>
using namespace boost;
int main() {
typedef adjacency_list< listS, vecS > Graph;
Graph g;
add_edge(0,1,g);
return 0;
}
我错过了什么?不进一步修改其余代码,顶点容器不是应该可以互换的吗?
【问题讨论】:
-
我看不出它们可以互换的理由:
vector是随机访问,而list不是。可能有一个非随机访问接口可以让您填充边缘,或者库可能需要随机访问...... -
如果你使用
listS作为顶点列表,你不能通过索引将顶点传递给add_edge。
标签: c++ list boost vector boost-graph