$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Andrej van der Zee (mavdzee_at_[hidden])
Date: 2007-06-13 03:10:23
Hi,
Indeed everything compiles again with boost 1.34! 
Thanks alot,
Andrej
--- Joaquín Mª López Muñoz <joaquin_at_[hidden]> wrote:
> Hello Andrej,
> 
> Andrej van der Zee ha escrito:
> 
> > 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.
> 
> Yes, this is an odd C++ restriction with pointers to
> member functions
> when used as non-type template parameters: although
> Bar inherits
> from Foo, &Bar::a (which is an alias for &Foo::a) is
> not seen (statically)
> as a valid int (Bar:: *) --usual base-derived
> relationships don't apply
> here. That's why you had to use Foo as the base
> class of member.
> BTW, the expression
> 
>   member<Foo, int, &Bar::a>
> 
> is entirely equivalent to
> 
>   member<Foo, int, &Foo::a>
> 
> although the latter is probably clearer.
> 
> > However, even with this, when trying to do a
> search:
> > [...]
> > I get this:
> >
> > /usr/include/boost/multi_index/member.hpp:
> > [...]
> > 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.
> 
> Your code will work out of the box with Boost 1.34,
> where some issues
> about key extractors being fed derived classes are
> solved (see bullet 3 of
>
http://boost.org/libs/multi_index/doc/release_notes.html#boost_1_34
> ).
> In case you can't upgrade to Boost 1.34, you can use
> a custom key
> extractor to work around the problem:
> 
> struct Bar_a_extractor
> {
>     typedef int result_type;
> 
>     int operator()(const Bar& b)const
>     {
>         return b.a;
>     }
> };
> 
> using namespace boost::multi_index;
> 
> typedef multi_index_container<
>     Bar,
>     indexed_by<
>         ordered_unique<
>             Bar_a_extractor
>         >
>     >
> > Bar_container;
> 
> Hope this helps,
> 
> Joaquín M López Muñoz
> Telefónica, Investigación y Desarrollo
> 
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
>
http://listarchives.boost.org/mailman/listinfo.cgi/boost-users
> 
        
        
                
___________________________________________________________ 
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