C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

multi_index and base class

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ Language (Moderated)
View previous topic :: View next topic  
Author Message
Road Dog
Guest





PostPosted: Thu May 10, 2007 9:30 pm    Post subject: multi_index and base class Reply with quote



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>
Quote:


Bar_container;

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! ]
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ Language (Moderated) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.