我正在努力在流中转储图表,其中所述图表是boost::subgraph
的结构版本。
我尝试提供property writer,但基本上它失败了,因为它似乎需要一个方法boost::get(PropertyWriter, VertexDescriptor)
。使用图表不的相同方法,subgraph
按预期工作。
作为found here,我必须使用boost::dynamic_properties
(请参阅下面的代码),但是当我的图表不可写时它会失败(而the documentation表示该图表被视为满足参考)。
这是一个我无法开始工作的简单示例:
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/subgraph.hpp>
struct VertexProperties
{
std::string name;
};
int main()
{
typedef boost::subgraph<
boost::adjacency_list<
boost::vecS, boost::vecS,
boost::directedS,
boost::property<boost::vertex_index_t, std::size_t, VertexProperties>,
boost::property<boost::edge_index_t, std::size_t> > > Graph;
Graph const g;
boost::dynamic_properties dp;
dp.property("name", boost::get(&VertexProperties::name, g));
dp.property("node_id", boost::get(boost::vertex_index, g));
boost::write_graphviz_dp(std::cout, g, dp);
}
欢迎任何提示!非常感谢,
修改
我忘了提到“失败”在我的案件中意味着什么;我尝试编译时出现错误:
错误:将'const std :: basic_string'作为'this'参数传递给'std :: basic_string&lt; _CharT,_Traits,_ Alloc&gt;&amp; std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: operator =(const std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;&amp;)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator ,std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; = std :: basic_string]'丢弃限定符[-fpermissive]
答案 0 :(得分:1)
正如所建议的那样,我报告这是Boost.Graph(see the ticket)中的一个错误。
作为一种解决方法,通过访问公共范围内的成员m_graph
,似乎可以使用基础图代替子图。
以下是我使用属性编写器解决问题的方法:
struct VertexProperties
{
std::string name;
};
template <typename Graph> struct prop_writer
{
prop_writer(Graph const& g): g_(g) {}
template <typename Vertex> void operator()(std::ostream& out, Vertex v) const
{
out << g_[v].name;
}
Graph const& g_;
}
typedef boost::subgraph<
boost::adjacency_list<
boost::vecS, boost::vecS,
boost::directedS,
boost::property<boost::vertex_index_t, std::size_t, VertexProperties>,
boost::property<boost::edge_index_t, std::size_t> > > Graph;
Graph const g;
// Note the use of g.m_graph here.
boost::write_graphviz(std::cout, g.m_graph, prop_writer<Graph>(g));