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 mailing list proto@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/proto