Boost logo

Boost Users :

From: Andrej van der Zee (mavdzee_at_[hidden])
Date: 2007-06-12 23:59:29


Hi,

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>
>
>
> 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>
>, 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

        
        
                
___________________________________________________________
New Yahoo! Mail is the ultimate force in competitive emailing. Find out more at the Yahoo! Mail Championships. Plus: play games and win prizes.
http://uk.rd.yahoo.com/evt=44106/*http://mail.yahoo.net/uk


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