2015-12-08 6 views
2

Этот вопрос касается boost :: graph и как обрабатывать свойства, связанные с вершинами (и/или ребрами). Я довольно смущен в обработке этого, но я подозреваю, что это может быть проблема, связанная с шаблонами.boost :: проблема компиляции графа с dynamic_properties и write_graphviz

Скажем, у меня есть такое определение графика:

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 что:

There are two kinds of graph properties: interior and exterior.

Вернуться к моей главной вопрос. Теперь, я могу и распечатку создания экземпляра графа с помощью «точки» форматировать этот путь:

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); 
} 

Online here

Это основано на 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: error: assignment of read-only location ...

Любые идеи, что я сделал не так?

ответ

3

property_map.hpp:361:44: error: assignment of read-only location ...

Да, к сожалению, тот факт, что g является сопзЬ там делает функцию завода по умолчанию property незаконными. Динамические свойства строятся записываемым образом, если модель это позволяет:

Requirements: PropertyMap must model Readable Property Map or Read/Write Property Map.

Поскольку карта свойства записи, динамическое свойство компилирует пишущую ветвь тоже.

Вы должны принять аргумент как неконстантный или вручную переопределить свойства для базовых карт (см. Здесь комментарии (Cut set of a graph, Boost Graph Library)).

Возможно, вы сообщите об этом как проблеме юзабилити, так как логически, свойства должны быть там.

+0

Спасибо, просто попробовал с удалением 'const', работает, но действительно нелогично, поэтому я даже не пытался сначала. Я исследую это. – kebs