Распечатайте составной подграф с помощью write_graphviz()
-
12-12-2019 - |
Вопрос
Я изо всех сил пытаюсь выгрузить график в поток, где указанный график представляет собой составную версию boost::subgraph
.
Я попытался предоставить писатель по недвижимости но в основном это не удается, потому что, похоже, требуется метод boost::get(PropertyWriter, VertexDescriptor)
.Используя ту же методологию, что и график нет а subgraph
работает так, как ожидалось.
Как нашел здесь, мне нужно использовать boost::dynamic_properties
(см. код ниже), но он терпит неудачу, когда мой график недоступен для записи (тогда как документация указывает, что график воспринимается как констифицированная ссылка).
Вот простой пример, который я не могу заставить работать:
#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<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT , _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string]' отбрасывает квалификаторы [-fpermissive ]
Решение
Как и было предложено, я сообщил, что это ошибка в Boost.Graph (посмотреть билет).
В качестве обходного пути можно использовать базовый граф вместо подграфа, обратившись к элементу 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));