1

次のアクションを考えると

struct Data {
    double d;
    void operator()( double dd,
                     boost::spirit::qi::unused_type,
                     boost::spirit::qi::unused_type )
    { d = dd; }
};

struct Printer {
    void operator()( double dd,
                     boost::spirit::qi::unused_type,
                     boost::spirit::qi::unused_type ) const
    { std::cout << dd; }
};

コード

void foo( const std::string &s ) {
    Printer p;
    boost::spirit::qi::parse( s.begin(), s.end(),
                              boost::spirit::qi::double_[ p ] );
}

しながらコンパイルします

double foo( const std::string &s ) {
    Data d;
    boost::spirit::qi::parse( s.begin(), s.end(),
                              boost::spirit::qi::double_[ d ] );
    return d.d;
}

ではない。

http://www.boost.org/doc/libs/1_53_0/libs/spirit/doc/html/spirit/qi/tutorials/semantic_actions.htmlの例を見ると、関数オブジェクトがoperator()宣言された を使用していることがわかりconstます。MSVC のエラー メッセージ C3848 は、同様のことを示唆しています。

ここで一貫性が必要ですか?http://www.boost.org/doc/libs/1_53_0/libs/spirit/doc/html/spirit/qi/reference/action.htmlのドキュメントには、署名void( Attrib&, Context, bool& )が必要であるとのみ記載されています。

備考: 私はその文をよく理解していないことを認めなければなりません

関数または関数オブジェクトは、最初のパラメーター に割り当てることによって、出力を生成するための値を返すことが期待されますattr

このコンテキストで。

4

1 に答える 1