|
Boost Users : |
From: Jeffrey Holle (jeffreyholle_at_[hidden])
Date: 2007-09-24 17:07:35
I am having problems using the modify method with my composite_key.
Here is my multi_index container definition:
typedef multi_index_container<
entry,
indexed_by<
ordered_unique<member<entry,DataVertex,&entry::m_vertex> >,
ordered_non_unique<
composite_key<
entry,
member<entry,int,&entry::m_y>,
member<entry,int,&entry::m_x>
>
>
>
> C;
C m_c;
namespace ll=boost::lambda;
typedef nth_index<C,1>::type XYINDEX;
I have a XYINDEX::iterator that is defined using the equal_range method
of an XYINDEX order. Now I wish to modify the m_x attribute that this
iterator points to so I attempt to write:
inline void
Positioner::updateX(XYIterator iter,int x)
{
m_c.modify(iter,(&ll::_1)->*&Positioner::entry::m_x=x);
}
I get this compiler error:
positioner.h:77: error: no matching function for call to
'boost::multi_index::multi_index_container<Positioner::entry,
boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::member<Positioner::entry,
unsigned int, &Positioner::entry::m_vertex>, mpl_::na, mpl_::na>,
boost::multi_index::ordered_non_unique<boost::multi_index::composite_key<Positioner::entry,
boost::multi_index::member<Positioner::entry, int,
&Positioner::entry::m_y>, boost::multi_index::member<Positioner::entry,
int, &Positioner::entry::m_x>, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na>, std::allocator<Positioner::entry>
>::modify(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<Positioner::entry>
>, mpl_::na>&, const
boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::assignment_action>,
boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2,
boost::lambda::other_action<boost::lambda::member_pointer_action> >,
boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::addressof_action>,
boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1>
>, boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type> > >, int Positioner::entry::* const,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type> > >, const int,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type> > >)'
I have also tried:
m_c.modify_key(iter,ll::_1=x);
But this gives me this error:
positioner.h:78: error: no matching function for call to
'boost::multi_index::multi_index_container<Positioner::entry,
boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::member<Positioner::entry,
unsigned int, &Positioner::entry::m_vertex>, mpl_::na, mpl_::na>,
boost::multi_index::ordered_non_unique<boost::multi_index::composite_key<Positioner::entry,
boost::multi_index::member<Positioner::entry, int,
&Positioner::entry::m_y>, boost::multi_index::member<Positioner::entry,
int, &Positioner::entry::m_x>, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na>, std::allocator<Positioner::entry>
>::modify_key(boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<Positioner::entry>
>, mpl_::na>&, const
boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::assignment_action>,
boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1>
>, const int, boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type> > >)'
While a method like this compiles and works, I would like to be more
efficent:
inline void
Positioner::updateX(DataVertex vertex,int x)
{
C::iterator iter=m_c.find(vertex);
assert(iter!=m_c.end());
m_c.modify(iter,(&ll::_1)->*&Positioner::entry::m_x=x);
}
Can somebody tell me if what I'm trying to do is possible?
If so, how?
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net