|
Boost Users : |
Subject: [Boost-users] workaround ideas?
From: Noah Roberts (roberts.noah_at_[hidden])
Date: 2009-03-03 11:59:51
This may be a little OT but as it applies to metaprogramming and ideas
from the book I thought it the best place to ask.
On pgs 191/2 of the MPL book (section 9.5) is a set of ideas meant to
introduce the inherit_linearly metafunction. There are some things I
want to do that suggested this was actually the better way to go for me.
So I implemented something like the following:
struct empty {};
template < typename FIELD, typename CDR >
struct rec : CDR
{
typename FIELD::type value;
rec() : value() {}
};
template < typename VEC >
struct generate_record
//: boost::mpl::inherit_linearly< VEC, boost::mpl::inherit<
rec<pl::_2>, pl::_1> >::type
: boost::mpl::fold< VEC, empty, rec< pl::_2, pl::_1> >
{};
I implemented a getter function like so:
template < typename FIELD, typename CDR >
typename FIELD::type & get(rec< FIELD, CDR > & r)
{
return r.value;
}
Now, minus the "field" concept this seems to be exactly the same basic
thing. The field concept is something I need for what I'm working on
that currently, for this test, just has a type in it.
I create a "record" like so:
typedef generate_record< boost::mpl::vector<field1, field2, field3>
>::type test_record;
When I print the type I end up with:
"rec<field3,rec<field2,rec<field1,empty> > >"
and in main attempt to access it:
test_record tr;
get<field1>(tr) = 3;
This works fine in comeau and I'd expect it to work anywhere but MSVC++
8 doesn't like it. It says that the FIELD param is ambiguous and could
be field1 (what I specified in the call) or field3 (the first field on
the inheritance tree). The error text is exactly:
1>e:\dev_workspace\experimental\record_generation\record_generation\main.cpp(78)
: error C2782: 'FIELD::type &get(rec<FIELD,CDR> &)' : template parameter
'FIELD' is ambiguous
1>
e:\dev_workspace\experimental\record_generation\record_generation\main.cpp(58)
: see declaration of 'get'
1> could be 'field3'
1> or 'field1'
I'm calling this a compiler bug at this point. I suspect many here have
had to deal with this, since it's basic template usage, and might know a
workaround. Or maybe you see something I've done incorrectly.
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