次のアクションを考えると
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
。
このコンテキストで。