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?

No.

> 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
Constants.

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

-- 
Eric Niebler
BoostPro Computing
http://www.boostpro.com

Proto list run by eric at boostpro.com