
On 03/05/2010 7:33 PM, Trevor Harmon wrote:
Hi,
I have a question about line 54 of the canonical_ordering example:
graph g(6); ... property_map<graph, edge_index_t>::type e_index = get(edge_index, g);
If I'm reading the Boost source code correctly, the get function's graph argument is declared const. This makes sense intuitively because, well, why would the graph need to be modified in order to retrieve a property? So the graph parameter passed to get() could be made const, correct? Like this:
graph g(6); ... const graph g2 = g; property_map<graph, edge_index_t>::type e_index = get(edge_index, g2);
However, the above change gives a compiler error:
conversion from ‘boost::adj_list_edge_property_map<boost::undirected_tag, int, const int&, size_t, const boost::property<boost::edge_index_t, int, boost::no_property>, boost::edge_index_t>’ to non-scalar type ‘boost::adj_list_edge_property_map<boost::undirected_tag, int, int&, size_t, boost::property<boost::edge_index_t, int, boost::no_property>, boost::edge_index_t>’ requested
Can anyone explain why? Thank you,
Trevor
I've run into this myself (and asked about it in this list somewhere as well), the short answer is that it's easier to simply pass in a non-const graph. I can't remember the long answer, but I believe it has to do with the implementation of property_map<..>::type and const_type and the property (eg. edge_index_t) template parameter. Note though that I could (and may well) be wrong. Geoff