Этот вопрос касается 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);
}
Это основано на 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 ...
Любые идеи, что я сделал не так?
Спасибо, просто попробовал с удалением 'const', работает, но действительно нелогично, поэтому я даже не пытался сначала. Я исследую это. – kebs