[Graph] No known conversion from int to vertex_iterator

I'm using BGL to store 3D triangle meshes, and I'm also using the ANN lib to find nearest neighbours of mesh points. My code used to work, using gcc 4.4 and BGL 1.40 (in Ubuntu 10.04), but since upgrading to gcc 4.6 and BGL 1.48 (in Ubuntu 12.04), my code doesn't compile anymore. I cut down my code to a minimal (I think) example that shows my problem. The attached code compiles with the old setup (I just get a warning that adjacency_list.hpp uses a deprecated header), but it does not compile in Ubuntu 12.04, The compilation error I get is "no matching function for call to 'Mesh::Vertex_Iterator::Vertex_Iterator(const Mesh* const, unsigned int&)'" The reason for that is that there is "no known conversion for argument 2 from 'unsigned int' to 'Mesh::Vertex_Graph_Iterator {aka boost::range_detail::integer_iterator<unsigned int>}'" Could anybody explain why, and what I can do to solve it? Is there any way to create a boost::adjacency_list::vertex_iterator using an int in the current version of BGL? #include <boost/graph/adjacency_list.hpp> class Mesh { public: typedef boost::property< boost::vertex_index1_t, int32_t, // The actual vertex boost::property< boost::vertex_index2_t, std::vector< unsigned int >, // Connected mesh faces boost::property< boost::vertex_rank_t, bool > > > // Boundary flag Vertex_Properties; typedef boost::property< boost::edge_weight_t, double > Edge_Length; typedef boost::adjacency_list < boost::setS, // No parallel edges boost::vecS, // Loading gets painful if this is setS boost::undirectedS, // Edges are undirected Vertex_Properties, // Vertices store Vertex, faces & bnd. flag Edge_Length > // Edges store their length Vertex_Graph; typedef Vertex_Graph::vertex_iterator Vertex_Graph_Iterator; //---------------------------------------------------------------// // VERTEX ITERATOR: //---------------------------------------------------------------// class Vertex_Iterator : public boost::iterator_adaptor <Vertex_Iterator, Vertex_Graph_Iterator, int32_t, boost::bidirectional_traversal_tag> { public: Vertex_Iterator() {} Vertex_Iterator( const Mesh* const mesh, Vertex_Graph_Iterator p ) : its_parent (mesh), its_vertex (p) {} const Mesh* its_parent; Vertex_Graph_Iterator its_vertex; }; void test_function() const; }; void Mesh::test_function() const { unsigned int i = 1; std::vector< Mesh::Vertex_Iterator > closest (10); closest[1] = Vertex_Iterator ( this, i ); //THIS IS THE PROBLEM } int main( int argc, char** argv ) { Mesh m; m.test_function(); return 0; }

On Wed, 4 Jul 2012, Martin Magnusson wrote:
I'm using BGL to store 3D triangle meshes, and I'm also using the ANN lib to find nearest neighbours of mesh points. My code used to work, using gcc 4.4 and BGL 1.40 (in Ubuntu 10.04), but since upgrading to gcc 4.6 and BGL 1.48 (in Ubuntu 12.04), my code doesn't compile anymore.
I cut down my code to a minimal (I think) example that shows my problem. The attached code compiles with the old setup (I just get a warning that adjacency_list.hpp uses a deprecated header), but it does not compile in Ubuntu 12.04,
The compilation error I get is "no matching function for call to 'Mesh::Vertex_Iterator::Vertex_Iterator(const Mesh* const, unsigned int&)'"
The reason for that is that there is "no known conversion for argument 2 from 'unsigned int' to 'Mesh::Vertex_Graph_Iterator {aka boost::range_detail::integer_iterator<unsigned int>}'"
Could anybody explain why, and what I can do to solve it? Is there any way to create a boost::adjacency_list::vertex_iterator using an int in the current version of BGL?
That constructor would not have been documented before, so it would not work reliably. If you need an iterator to the nth vertex (zero-based), use boost::next(vertices(g).first, n). If you just need the vertex descriptor, use vertex(n, g). -- Jeremiah Willcock
participants (2)
-
Jeremiah Willcock
-
Martin Magnusson