Trying to use template domain class with BOOST_PROTO_BASIC_EXTENDS ends up in an error leading to the fact this ligne in the macro is incorrect when the Domain is template: BOOST_PROTO_BASIC_EXTENDS_(Expr, Derived, Domain) typedef void proto_is_aggregate_; typedef Domain::proto_generator proto_generator; Obviously this is alckign a typename before Domain::proto_generator if Domain is actually a template class. Thing is used to work before ( aorund 1.40) so I guess somethign changed around here. I guess a details meta-function extracting the domain will fix that or am I wrong ? namespace boost { namespace proto { template<class Domain> generator_of { typedef typename Domain::proto_generator type; }; } } BOOST_PROTO_BASIC_EXTENDS_(Expr, Derived, Domain) typedef void proto_is_aggregate_; typedef typename generator_of<Domain>::type proto_generator; Or is it ?