The forward declarations are tricky because ring_adjacency_iterator_generator
adapts ring_incident_edge_iterator, which in turn has template parameters
defined in terms of graph_traits<>.
After playing around a bit more I was able to
use boost::adjacency_iterator_generator::type by making it a base class
of ring_adjacency_iterator_generator. This ends up only saving a few
keystrokes from the version that derives it directly
from boost::adjacency_iterator, but it still feels like the right thing to
do. I was also able to keep everything parameterized through
graph_traits<>.
This example feels done. Thanks for your help.
On Wed, Jun 30, 2010 at 9:50 PM, Jeremiah Willcock
On Tue, 29 Jun 2010, W.P. McNeill wrote:
It looks like the adjacency_iterator created
by adjacency_iterator_generator was being defined in terms of vertex_descriptor and out_edge_iterator, which are in turn defined via graph_traits<>, which would cause this problem. I got a little closer to an ideal solution by putting
typedef ring_adjacency_iterator adjacency_iterator;
in the graph class and forward-defining ring_adjacency_iterator, then later on in implicit.hpp deriving ring_adjacency_iterator from boost::adjacency_iterator like so
class ring_adjacency_iterator:public boost::adjacency_iterator< graph, vertex_descriptor, out_edge_iterator, boost::use_default> { public: typedef boost::adjacency_iterator< graph, vertex_descriptor, out_edge_iterator, boost::use_default> parent_class; ring_adjacency_iterator() {}; ring_adjacency_iterator(const out_edge_iterator& ei, const graph* g): parent_class(ei, g) {}; };
I didn't have to typedef the adjacency_iterator to void in the graph definition, so this is a valid AdjacencyGraph model.
I like this better than writing my own iterator_adaptor because it uses boost::adjacency_iterator, though it feels a little hacky because the body of ring_adjacency_iterator is mostly cut-and-pasted from adjacency_iterator.hpp.
I'd like to find a way to define the adjacency iterator with the generator using the statement
boost::adjacency_iterator_generator
::type but I haven't been able to do it. This generator statement relies on graph_traits<> properties vertex_descriptor and out_edge_iterator, so has to come after the definition of implicit_ring::graph. But that means I have to have a forward declaration of the adjacency_iterator, and I don't know how to forward-declare something I'm getting from boost::adjacency_iterator_generator<>::type.
It's still pretty good, but if this is going to be example code I'd like to make sure I'm doing it the best way possible.
You have the actual types that vertex_descriptor, etc. are defined to, right? Can you use those as the arguments to adjacency_iterator_generator?
-- Jeremiah Willcock _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users