Распечатайте составной подграф с помощью write_graphviz()

Я изо всех сил пытаюсь сбросить график в потоке, где указанный график является конституированной версией 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» в качестве «этого» аргумента «std::basic_string‹_CharT, _Traits, _Alloc>& std::basic_string‹_CharT, _Traits, _Alloc>::operator=(const std::basic_string ‹_CharT, _Traits, _Alloc>&) [с _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator, std::basic_string‹_CharT, _Traits, _Alloc> = std::basic_string]' отбрасывает квалификаторы [ -fразрешительный]


person piwi    schedule 12.03.2012    source источник
comment
Не могли бы вы сообщить об этом в системе отслеживания ошибок Boost? Он должен работать.   -  person Jeremiah Willcock    schedule 24.03.2012
comment
Спасибо, я сделал, как вы предложили. Я также опубликовал ответ, который обеспечивает обходной путь.   -  person piwi    schedule 28.03.2012


Ответы (1)


Как и предполагалось, я сообщил об ошибке в 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));
person Community    schedule 28.03.2012