
Hi, I have a grammar, domain and an extended expression i.e. struct ga_domain : proto::domain<proto::generator<ga_expr>, ga_grammar> {}; template<typename Expr> struct ga_expr : boost::proto::extends<Expr, ga_expr<Expr>, ga_domain> { // .... }; When the expression is transformed some instances of the ga_expr<> wrapper get removed. For example // some function that expects a ga_expr<Expr> as 2nd arg void evaluate_expr(Res& res, const ga_expr<Expr>& expr) { // .... } // some function which transforms the expression and calls evaluate_expr() template <class Res, class Expr> void evaluate(Res& res, const ga_expr<Expr>& expr) { BOOST_MPL_ASSERT((proto::matches< ga_expr<Expr>, ga_grammar>)); evaluate_expr(res, ET::transform_expression()(expr) ); } With the (do nothing) transform struct transform_expression : proto::nary_expr<proto::_, proto::vararg<transform_expression> > {}; I get the following messages (using gcc 4.4.1, boost 1.42) In function ‘void clifford::evaluate(Res&, const clifford::ga_expr<Expr>&) [with Res = clifford::element<clifford::basis::basis<clifford::cga3::basis::rotator_basis_list, mpl_::integral_c<unsigned int, 105u> >, clifford::cga3::cga3, clifford::default_tags>, Expr = boost::proto::exprns_::expr<clifford::tag::reverse_, boost::proto::argsns_::list1<clifford::ga_expr<boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const clifford::element<clifford::basis::basis<boost::mpl::vector10_c<short int, 3, 5, 6, 9, 10, 12, 17, 18, 20, 24>, mpl_::integral_c<unsigned int, 18224744u> >, clifford::cga3::cga3, clifford::default_tags>&>, 0l> > >, 1l>]’: error: no matching function for call to ‘evaluate_expr(clifford::element<clifford::basis::basis<clifford::cga3::basis::rotator_basis_list, mpl_::integral_c<unsigned int, 105u> >, clifford::cga3::cga3, clifford::default_tags>&, boost::proto::exprns_::expr<clifford::tag::reverse_, boost::proto::argsns_::list1<const clifford::ga_expr<boost::proto::exprns_::expr<boost::proto::tag::terminal, boost::proto::argsns_::term<const clifford::element<clifford::basis::basis<boost::mpl::vector10_c<short int, 3, 5, 6, 9, 10, 12, 17, 18, 20, 24>, mpl_::integral_c<unsigned int, 18224744u> >, clifford::cga3::cga3, clifford::default_tags>&>, 0l> >&>, 1l>&)’ So the clifford::ga_expr<> wrapper got removed from the unary reverse operator and i'm not sure what i'm supposed to add to make it stay. thanks