Boost logo

Proto :

Subject: Re: [proto] invalid use of incomplete type 'detail::uncvref<...>'
From: Eric Niebler (eric_at_[hidden])
Date: 2011-02-28 15:26:32

On 3/1/2011 3:15 AM, Hossein Haeri wrote:
> Hi Eric,
>> boost/proto/matches.hpp:391:13: error: invalid use of incomplete
>> type 'struct
>> boost::proto::detail::uncvref<arity_caller::CanBeCalled<Plus2,
>> mpl_::integral_c<int, 2> > >::type' Now look at how you've defined
>> CanBeCalled:
>> template<typename Fun, typename Int> struct CanBeCalled;
> Thanks. I added another specialisation for mpl::integral_c<int, n> >
> and it worked. But, now I'm wondering why on earth was that basically
> needed? I had never touched mpl::integral_c in my code snippet. That
> should have been generated by Proto then, right?


> And, in that case,
> may I please know why?

Somewhere in your code you're adding two MPL integers. That's just how
MPL works. Your code is assuming a particular type of Integral Constant
(mpl::int_). MPL only promises to give you /a/ MPL Integral Constant.

> On the other hand, I'm wondering why GCC never nagged about the need
> for mpl::integral_c<int, 1> when I wrote:
> EW1<InpPool, GameState, AmmoMsg>() >> Plus1();
> In other words, why is mpl::int_<n> used for the above line (when n
> == 1), whereas mpl::integral_c<int, n> is used for the following one
> (when n == 2)?
> (EW1<InpPool, GameState, AmmoMsg>() || EW1<InpPool, GameState,
> AmmoMsg>()) >> Plus2();

Probably because the former isn't doing an addition of MPL Integral

This is an MPL "gotcha". Others have complained about it on the boost
list, IIRC.

Eric Niebler
BoostPro Computing

Proto list run by eric at