私はspiritlexの例4に示されているコードに基づいて動作するトークンパーサーを作成しました
私のルールの1つは次のようになります
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
std::cout << val("set name statement to: ") << _3 << "\n"
]
;
これはうまく機能します。提示されたとき
SET NAME xyz
期待通りに出力します
名前ステートメントを次のように設定します:xyz
今、私は何か便利なことをしたいので、見つけた名前をクラスに保存します。パーサーのセマンティックの例から作業して、このコードを記述します
class writer
{
public:
void print(string const& s) const
{
std::cout << s << std::endl;
}
};
writer w;
...
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
boost::bind( &writer::print, &w, ::_3 )
]
;
これはコンパイルされません
1> C:\ Program Files \ boost \ boost_1_44 \ boost / bind / bind.hpp(318):エラーC2664:'R boost :: _ mfi :: cmf1 :: operator()(const U&、A1)const':パラメータ2を「bool」から「conststd::basic_string」に変換できません 1>と 1> [ 1> R = void、 1> T = eCrew :: rule :: writer、 1> A1 = const std :: string&、 1> U = eCrew :: rule :: writer * 1>] 1>および 1> [ 1> _Elem = char、 1> _Traits = std :: char_traits、 1> _Ax = std :: allocator 1>] 1>理由:「bool」から「conststd::string」に変換できません 1>コンストラクターがソース型を取得できないか、コンストラクターのオーバーロード解決があいまいでした
コンパイラがboolからstringに変換しようとしていることに不満を言うのはなぜですか?私が見ることができるブールはありません。