ostr << "template<class LHS,class RHS>" << endl << "inline LHS&" << endl << opdef.function() << "(LHS& lhs,const RHS& rhs)" << endl << "{" << endl << "  typedef typename CreateLeaf<RHS>::Leaf_t Leaf_t;" << endl << "  evaluate(lhs," << opdef.tag() << "(),MakeReturn<Leaf_t>::make(CreateLeaf<RHS>::make(rhs)));" << endl << "  return lhs;" << endl << "}" << endl;
ostr << "template<" << joinWithComma("class T1",class1.argDef(2)) <<">" << endl << "inline typename MakeReturn<UnaryNode<" << opdef.tag() << "<T1>," << endl << "  typename CreateLeaf<" << class1.inputClass(2) << " >::Leaf_t>," << endl << "  typename UnaryReturn<C2," << opdef.tag() << " >::Type_t >::Expression_t" << endl << "" << opdef.function() << "(const T1&, const " << class1.inputClass(2) << " & l)" << endl << "{" << endl << "  typedef UnaryNode<" << opdef.tag() << "<T1>," << endl << "    typename CreateLeaf<" << class1.inputClass(2) << " >::Leaf_t> Tree_t;" << endl << "  typedef typename UnaryReturn<C2," << opdef.tag() << " >::Type_t Container_t;" << endl << "  return MakeReturn<Tree_t,Container_t>::make(Tree_t(" << endl << "    CreateLeaf<" << class1.inputClass(2) << " >::make(l)));" << endl << "}" << endl;
  void print(OSTR& ostr,const OperatorDescriptor& opdef) const  {    ostr << endl;    // Print a comment above the function    if (class1.userClass())    {      cerr << "func= " << opdef.function() << "  comment1 = " << opdef.comment1() << endl;      ostr << opdef.comment1() << endl;      ostr << opdef.comment2() << endl;    }    ostr      << "template<class LHS,class RHS>" << endl      << "inline LHS&" << endl      << opdef.function()      << "(LHS& lhs,const RHS& rhs)" << endl      << "{" << endl      << "  typedef typename CreateLeaf<RHS>::Leaf_t Leaf_t;" << endl      << "  evaluate(lhs," << opdef.tag()      << "(),MakeReturn<Leaf_t>::make(CreateLeaf<RHS>::make(rhs)));"       << endl      << "  return lhs;" << endl      << "}" << endl;  }