
Nico Galoppo <nico@crossbar.net> writes:
Thanks, that works like a charm. Unfortunately, dereferencing the created iterator gives more trouble:
boost::function<bool (shared_ptr<node_type const>)> is_constraint = boost::bind(&node_type::IsConstraint, _1); typedef boost::filter_iterator<boost::function<bool (shared_ptr<node_type const>)>, articulated_model_type::node_df_traversal_iterator> joint_node_iterator;
joint_node_iterator jointnode = boost::make_filter_iterator(is_constraint, ab.begin(), ab.end());
std::cout << jointnode->Model(); ///< this line fails to compile
There seems to be a problem with const-ness (see below).
It's not a constness problem, exactly. The problem is that the result of *ab.begin() is an rvalue (i.e. returned by value, not by reference). Yet the filter_iterator thinks it is iterating over lvalues: its reference type is Hybrid::Graph<node_traits>::const_node_ptr&, and the compiler is complaining that you can't initialize such a reference with a non-lvalue. It's hard to come up with a complete analysis with the little information I have here, but I believe Hybrid::Graph<Hybrid::ArticulatedModelNodeTraits<MyTypes> >::node_df_traversal_iterator is misreporting its reference type or its category. An iterator whose operator* returns by value cannot be a forward iterator; it can only be an input iterator. -- Dave Abrahams Boost Consulting www.boost-consulting.com