multi_index and base class
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
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 , KeyFromValue = boost::multi_index::member 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
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
> > 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
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
Hi,
Indeed everything compiles again with boost 1.34!
Thanks alot,
Andrej
--- Joaquín Mª López Muñoz
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
> > 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
is entirely equivalent to
member
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@lists.boost.org
http://lists.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
participants (2)
-
Andrej van der Zee
-
Joaquín Mª López Muñoz