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