【发布时间】:2015-12-08 15:55:17
【问题描述】:
这个问题是关于 boost::graph 以及如何处理与顶点(和/或边)相关的属性。我对处理这个问题感到很困惑,但我怀疑这可能是与模板相关的问题。
假设我有这个图形定义:
struct myVertex_t {
int color;
};
typedef boost::adjacency_list<
boost::vecS, // edge container
boost::vecS, // vertex container
boost::undirectedS, // type of graph
myVertex_t, // vertex properties
boost::property< // edge properties
boost::edge_color_t, // ???
boost::default_color_type // enum, holds 5 colors
>
> myGraph_t;
AFAIK,这种存储顶点属性的方式称为 "bundle properties" 并且似乎是存储此信息的第三种方式,尽管据说 in the manual 那:
有两种图形属性:内部和外部。
回到我的主要问题。现在,我可以通过这种方式使用“点”格式实例化并打印出一个图形:
int main()
{
myGraph_t g;
boost::add_edge(0, 1, g);
boost::dynamic_properties dp;
dp.property("color", boost::get( &myVertex_t::color, g ) );
dp.property("node_id", boost::get( boost::vertex_index, g ) );
boost::write_graphviz_dp( std::cout , g, dp);
}
这是基于this answer 在一个类似的问题中,并且编译得很好。
现在我想在一个单独的函数中分离打印,所以我在模板函数中编写相同的代码,只是用模板类型参数替换具体类型:
template<typename graph_t, typename vertex_t>
void RenderGraph( const graph_t& g )
{
boost::dynamic_properties dp;
dp.property( "color", boost::get( &vertex_t::color, g ) );
dp.property( "node_id", boost::get( boost::vertex_index, g ) );
boost::write_graphviz_dp( std::cout, g, dp );
}
int main()
{
myGraph_t g;
boost::add_edge(0, 1, g);
RenderGraph<myGraph_t,myVertex_t>( g );
}
但是这个does not compile:
property_map.hpp:361:44:错误:分配只读位置...
任何想法我做错了什么?
【问题讨论】:
标签: c++ boost graphviz boost-graph