BGL: Problem accessing property_map members

Hi, I am trying to use the BGL to model a simple directed graph with internal edge properties. Following the example given in the documentation[1], I have done the following (with question-irrelevant padding removed): ------------------------------- #include <boost/graph/adjacency_list.hpp> #include <boost/property_map.hpp> typedef boost::property<boost::edge_weight_t, double> EdgeProperties; typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperties> NetworkGraph; typedef std::pair<int, int> Edge; NetworkGraph g(5); boost::add_edge(0, 1, g); boost::add_edge(0, 2, g); boost::add_edge(1, 3, g); boost::add_edge(2, 3, g); boost::add_edge(3, 4, g); boost::property_map<NetworkGraph, boost::edge_weight_t>::type weights = boost::get(boost::edge_weight_t(), g); weights[0] = 1.0; weights[1] = 1.0; weights[2] = 1.0; weights[3] = 1.0; weights[4] = 1.0; ------------------------------- Which all looks fairly kosher. However, attempting to compile this results in a error on each of the weights assignment lines: "error: no match for 'operator[]' in 'weights[0]' Using the syntax boost::put(weights, 0, 1.0) just moves this error inside a parameter_set template definition. Can anybody shed any light on this? For the record this is on MacOS X 10.5.1, with GCC 4.0.1 (i686-apple-darwin9-gcc-4.0.1). Regards, James Jackson. [1] interior_property_map.cpp

--- James Jackson wrote:
Hi,
Hello!
I am trying to use the BGL to model a simple directed graph with internal edge properties. Following the example given in the documentation[1], I have done the following (with question-irrelevant padding removed):
------------------------------- #include <boost/graph/adjacency_list.hpp> #include <boost/property_map.hpp>
typedef boost::property<boost::edge_weight_t, double> EdgeProperties; typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperties> NetworkGraph; typedef std::pair<int, int> Edge;
NetworkGraph g(5); boost::add_edge(0, 1, g); boost::add_edge(0, 2, g); boost::add_edge(1, 3, g); boost::add_edge(2, 3, g); boost::add_edge(3, 4, g);
boost::property_map<NetworkGraph, boost::edge_weight_t>::type weights = boost::get(boost::edge_weight_t(), g); weights[0] = 1.0; weights[1] = 1.0; weights[2] = 1.0; weights[3] = 1.0; weights[4] = 1.0; -------------------------------
Which all looks fairly kosher.
Sorry, it isn't. Edge maps require edge_descriptors for keys. First, change your Edge type definition to this: typedef NetworkGraph::edge_descriptor Edge; Then, for adding edges, do the following: Edge e; bool b; boost::tie(e, b) = boost::add_edge(0, 1, g); if (b) { weights[e] = 1.0; } // etc. HTH, Cromwell D. Enage ____________________________________________________________________________________ Never miss a thing. Make Yahoo your home page. http://www.yahoo.com/r/hs

Hi, Thanks for the reply - I'm just trying to work out how this fits with the example given in interior_property_map.cpp (which compiles and runs file), where essentially this is done: enum vertex_first_name_t { vertex_first_name }; namespace boost { BOOST_INSTALL_PROPERTY(vertex, first_name); } typedef adjacency_list<vecS, vecS, directedS, property<vertex_first_name_t, std::string> > MyGraphType; MyGraphType G(5); // then for 11 edges: add_edge(start, end, G); property_map<MyGraphType, vertex_first_name_t>::type name = get(vertex_first_name, G); boost::put(name, 0, "Jeremy"); boost::put(name, 1, "Rich"); boost::put(name, 2, "Andrew"); boost::put(name, 3, "Jeff"); name[4] = "Kinis"; Of course, the difference here is that in the example names are being assigned to Vertices, not Edges - is this why there is a difference in the value assignment method? Regards, James. On 25 Jan 2008, at 05:05, Cromwell Enage wrote:
--- James Jackson wrote:
Hi,
Hello!
I am trying to use the BGL to model a simple directed graph with internal edge properties. Following the example given in the documentation[1], I have done the following (with question-irrelevant padding removed):
------------------------------- #include <boost/graph/adjacency_list.hpp> #include <boost/property_map.hpp>
typedef boost::property<boost::edge_weight_t, double> EdgeProperties; typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperties> NetworkGraph; typedef std::pair<int, int> Edge;
NetworkGraph g(5); boost::add_edge(0, 1, g); boost::add_edge(0, 2, g); boost::add_edge(1, 3, g); boost::add_edge(2, 3, g); boost::add_edge(3, 4, g);
boost::property_map<NetworkGraph, boost::edge_weight_t>::type weights = boost::get(boost::edge_weight_t(), g); weights[0] = 1.0; weights[1] = 1.0; weights[2] = 1.0; weights[3] = 1.0; weights[4] = 1.0; -------------------------------
Which all looks fairly kosher.
Sorry, it isn't.
Edge maps require edge_descriptors for keys. First, change your Edge type definition to this:
typedef NetworkGraph::edge_descriptor Edge;
Then, for adding edges, do the following:
Edge e; bool b;
boost::tie(e, b) = boost::add_edge(0, 1, g);
if (b) { weights[e] = 1.0; }
// etc.
HTH, Cromwell D. Enage
____________________________________________________________________________________ Never miss a thing. Make Yahoo your home page. http://www.yahoo.com/r/hs _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Cromwell Enage
-
James Jackson