这个问题是关于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,这种存储顶点属性的方法称为“束属性”,似乎是存储此信息的第三种方法,尽管在手册中说:
有两种图形属性:内部和外部。
回到我的主要问题。现在,我可以使用“点”格式实例化并打印图形:
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);
}
这是基于类似问题中的答案,并且可以编译。
现在,我想将打印分为一个单独的函数,因此我在模板化函数中编写了相同的代码,只是将具体类型替换为模板类型参数:
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 );
}
但这不能编译:
property_map.hpp:361:44:错误:分配只读位置...
有任何想法我做错了吗?
property_map.hpp:361:44:错误:分配只读位置...
是的,令人遗憾的是,g
那里的const使得默认的property
工厂功能非法。如果模型允许,则以可写方式构造动态属性:
要求:
PropertyMap
必须对可读属性映射或读/写属性映射建模。
由于属性映射是可写的,因此动态属性也会编译写作分支。
您必须将参数设为非常量,或手动覆盖基础地图的“属性”特性(例如,请参见此处的注释(例如,图形的割集,Boost Graph Library)。
您可能会考虑将其报告为可用性问题,因为从逻辑上讲,属性应该在那里const。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句