
Sorry for the delay. I'm back from my trip and getting caught up. Maurizio Vitale wrote:
This is a short example that shows the problem (I'm using GCC 4.1.2) (ARITY 1 fails for different reasons)
#define BOOST_PROTO_MAX_ARITY 2 #include <boost/xpressive/proto/proto.hpp> #include <boost/xpressive/proto/debug.hpp>
struct udt_tag {}; boost::proto::terminal<udt_tag>::type const udt = {{}};
struct my_type : boost::proto::extends<boost::proto::terminal<udt_tag>::type, my_type> { my_type (int i) {}; my_type () {}; };
int main() { my_type x;
x(1,2); return 0; }
Ah. There's a bug in proto/debug.hpp. It's fixed now. Thanks for the report.
eric.cpp(16): error: no instance of overloaded function "my_type::operator()" matches the argument list argument types are: (int, int) object type is: my_type x(1,2); ^
This is not a bug. This expression *looks* like it has arity 2, but it actually has arity 3, the three children being x, 1 and 2. By defining BOOST_PROTO_MAX_ARITY to 2, there is no operator() that accepts enough arguments. <snip>
At the moment it seems that only terminals will require data members, but if the plan I outlined above is viable, expression will need additional methods (for converting to builtin and user-defined data types).
So the reason I'm wrapping expression is to be able to add the appropriate conversion operators.
From later mails, it seems you now have this well in hand.
Thanks for all the hand-holding during my first steps with proto.
No problem. -- Eric Niebler Boost Consulting www.boost-consulting.com