C++ 分析字符串的Boost.Spirit语义操作无效

C++ 分析字符串的Boost.Spirit语义操作无效,c++,boost-spirit,boost-spirit-qi,C++,Boost Spirit,Boost Spirit Qi,我尝试编写一个Boost.Spirit解析器,解析一个字符串,该字符串应该表示一个简单的命令,比如print foo.txt。每次输入符合语法时,都应该调用一个语义动作 代码如下: template<class Iterator> struct my_parser : qi::grammar<Iterator, void(), qi::ascii::space_type> { void test(std::string const & s) const

我尝试编写一个Boost.Spirit解析器,解析一个字符串,该字符串应该表示一个简单的命令,比如print foo.txt。每次输入符合语法时,都应该调用一个语义动作

代码如下:

template<class Iterator>
struct my_parser : qi::grammar<Iterator, void(), qi::ascii::space_type>
{
    void test(std::string const & s) const
    {
        std::cerr << s << std::endl;
    }

    my_parser() : my_parser::base_type(print)
    {
        using qi::_1;
        using qi::char_;

        filename =
            *qi::char_("a-zA-Z_0-9./ ")
            ;

        print =
            qi::lit("print")
            >> filename [ boost::bind(&my_parser::test, this, _1) ]
            ;
    }

    qi::rule<Iterator, std::string()> filename;
    qi::rule<Iterator, void(), qi::ascii::space_type> print;
};
如果我试图编译它,我会得到如下结果:

no match for call to ‘(const boost::_mfi::cmf1<void, parser::my_parser<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >, const std::basic_string<char>&>) (parser::my_parser<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> > >* const&, const boost::phoenix::actor<boost::spirit::argument<0> >&)’
例如,如果我将_1替换为abc,则代码将编译,但输入print foo.txt的短语_parse返回false。如果我注释掉[boost:bind…]短语_parse返回true


有人知道我做错了什么吗?谢谢。

我相信您的问题在于,您试图将一个精灵占位符传递给boost::bind,它通常只适用于使用qi:\u 1隐藏的内置占位符。我会尝试添加define-BOOST\u-SPIRIT\u-USE\u-PHOENIX\u V3,添加include-BOOST/PHOENIX.hpp,然后选择BOOST::PHOENIX::bind和my-parser::test,这个,\u 1就可以了。

+1这就行了。我相信只要用气就可以了:(1);也会起作用,因为这是使用的方式。您可以在页面底部的重要部分找到问题的描述。