Dear all, In my namespace arity_caller, I have a struct CanBeCalled<> such that CanBeCalled<T, mpl::int_<n> >::type is an mpl::bool_<> representing whether T can be called with n doubles. I also have the following grammar (in a file called 'EmtnGram.hpp') in which I am trying to employ this CanBeCalled<>::type: struct EmtnShiftFObjGram: boost::proto::and_ < boost::proto::shift_right < EmtnTermOrGram, boost::proto::terminal<boost::proto::_> >, boost::proto::if_ < arity_caller::CanBeCalled < boost::proto::_value(boost::proto::_right), EmtnTermOrGram(boost::proto::_left) >::type >
{}; For an expression like x >> f, here, I am trying to make sure that f can be called with the right number of doubles -- that I have accumulated in x. When I compile this under GCC 4.5.1 (MinGW32, WinXP, SP3) and Boost 1.42, I get the following errors: In file included from main.cpp:5:0: EmtnGram.hpp:141:4: error: incomplete type 'arity_caller::CanBeCalled<boost::proto::_value(boost::proto::_child_c<1>), EmtnTermOrGram(boost::proto::_child_c<0>)>' used in nested name specifier EmtnGram.hpp:141:4: error: incomplete type 'arity_caller::CanBeCalled<boost::proto::_value(boost::proto::_child_c<1>), EmtnTermOrGram(boost::proto::_child_c<0>)>' used in nested name specifier EmtnGram.hpp:146:3: error: template argument 1 is invalid EmtnGram.hpp:147:2: error: template argument 2 is invalid Do I get it correctly that it's the ::type part of CanBeCalled<>::type that is confusing the compiler? Why is that happening? And, what's the cure? TIA, --Hossein