Road Dog Guest
|
Posted: Thu May 10, 2007 9:30 pm Post subject: multi_index and base class |
|
|
I'm trying to store these classes in a multi_index:
struct Foo
{
int a;
};
struct Bar
:Foo
{
};
typedef multi_index_container<
Bar,
indexed_by<
ordered_unique<
member<Foo, int, &Bar::a>
Notice I have to use "Foo" in the "member<" line.
However, even with this, when trying to do a search:
Bar_container bar_container;
int function()
{
Bar_container::nth_index<0>::type& a_index = bar_container.get<0>();
Bar_container::nth_index<0>::type::iterator i = a_index.find(5);
if (i != a_index.end())
return -1;
return 0;
}
I get this:
/usr/include/boost/multi_index/member.hpp: In member function 'Type&
boost::multi_index::detail::non_const_member_base<Class, Type,
PtrToMember>::operator()(const ChainedPtr&) const [with ChainedPtr = Bar,
Class =
Foo, Type = int, Type Class::* PtrToMember = &Foo::a]':
/usr/include/boost/multi_index/detail/ord_index_ops.hpp:65: instantiated
from
'Node* boost::multi_index::detail::ordered_index_find(Node*, const
KeyFromValue&,
const CompatibleKey&, const CompatibleCompare&) [with Node =
boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::i
ndex_node_base<Bar>
| Quote: | , KeyFromValue = boost::multi_index::member<Foo, int, &Foo::a>,
CompatibleKey = |
int, CompatibleCompare = std::less<int>]'
/usr/include/boost/multi_index/ordered_index.hpp:376: instantiated from
'boost::multi_index::detail::index_iterator<boost::multi_index::detail::orde
red_index_node<typename
SuperMeta::type::node_type> >
boost::multi_index::detail::ordered_index<KeyFromValue, Compare, SuperMeta,
TagList, Category>::find(const CompatibleKey&) const [with CompatibleKey =
int,
KeyFromValue = boost::multi_index::member<Foo, int, &Foo::a>, Compare =
std::less<int>, SuperMeta = boost::multi_index::detail::nth_layer<1, Bar,
boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::mul
ti_index::member<Foo,
int, &Foo::a>, 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, mpl_::na>,
std::allocator<Bar> >, TagList = boost::mpl::vector0<mpl_::na>, Category =
boost::multi_index::detail::ordered_unique_tag]'
multitest2.cc:55: instantiated from here
/usr/include/boost/multi_index/member.hpp:84: error: no match for
'operator*' in '*x'
I've tried a few alternatives such as providing a custom compare function
but I always get this error. It seems to have something to do with the
fact that the key is in the base class. If I move the key to the derived
class (and change the "member<" line), it works fine.
Surely there's a way to do this. Anyone know how ?
Using gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) and
libboost 1.33.1.
Thanks
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ] |
|