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