如何使boost-proto函数表达式可流化?

时间:2011-11-21 14:47:53

标签: c++ boost boost-proto

我正在讨论boost-proto教程,并使用懒惰的pow函数示例遇到了这个问题。这是示例代码:

// Define a pow_fun function object
template<int Exp> // , typename Func>
struct pow_fun
{
    typedef double result_type;
    double operator()(double d) const
    {
        return pow(d, Exp);
    }
};

// Define a lazy pow() function for the calculator DSEL.
// Can be used as: pow< 2 >(_1)
template<int Exp, typename Arg>
typename proto::result_of::make_expr<
    proto::tag::function  // Tag type
  , pow_fun<Exp>          // First child (by value)
  , Arg const &           // Second child (by reference)
>::type const
mypow(Arg const &arg)
{
    return proto::make_expr<proto::tag::function>(
        pow_fun<Exp>()    // First child (by value)
      , boost::ref(arg)   // Second child (by reference)
    );    
}

现在,如果我尝试

proto::display_expr( mypow<2>(_1) );

编译器抱怨它没有运算符&lt;&lt;为了 功能表达。我该如何定义一个?

感谢。

编译错误是:

/usr/include/boost/proto/debug.hpp:146:错误:'std :: operator&lt;&lt;'中的'operator&lt;&lt;'不匹配[with _Traits = std :: char_traits](((std :: basic_ostream&gt;&amp;)((std :: basic_ostream&gt; *)std :: operator&lt;&lt; [with _Traits = std :: char_traits]((( std :: basic_ostream&gt;&amp;)((std :: basic_ostream&gt; *)std :: operator&lt;&lt; [with _Traits = std :: char_traits]((std :: basic_ostream&gt;&amp;)((std :: basic_ostream&gt; *)std :: operator&lt;&lt; [with _CharT = char,_Traits = std :: char_traits](((std :: basic_ostream&gt;&amp;)((std :: ostream *)((const boost :: proto :: functional :: display_expr *)this) - &gt; boost :: proto :: functional :: display_expr :: sout_)),std :: setw((const boost :: proto :: functional :: display_expr *)this) - &gt; boost :: proto :: functional :: display_expr :: depth_)))),(((const boost :: proto :: functional :: display_expr *)this) - &gt; boost :: proto :: functional :: display_expr :: first_?((const char *)“”):((const char *)“,”))))),boost :: proto :: tag :: proto_tag_name((boost: :proto :: tag :: terminal(),boost :: proto :: tag :: terminal()))))),((const char *)“(”))&lt;&lt; boost :: proto ::值[使用Expr = boost :: proto :: expr ns _ :: expr&gt;,0l&gt;]((const boost :: proto :: exprns _ :: expr&gt;,0l&gt;&amp;)((const boost :: proto :: exprns _ :: expr&gt;,0l&gt; *)表达式)))'

1 个答案:

答案 0 :(得分:2)

这是哪个proto版本?最新的不需要&lt;&lt;再过载,默认为typeid,以便在需要时显示名称。你能发布实际的错误信息吗?