Qi语义动作的调用错误没有匹配函数

时间:2013-12-31 18:28:11

标签: c++ boost boost-spirit boost-spirit-qi

我的语法部分如下:

typedef SemanticActions< IterType > SemanticActionsType;

string_ %= lexeme[ +( spirit::qi::alnum | punct )];

component_ = lit( '-' ) >> string_[boost::bind( &SemanticActionsType::new_component_name, &actions_, _1, _2 )] 

和相应的语义动作类:

template< typename IterType >
class SemanticActions
{
public:
    SemanticActions( Design_p d ) : design_( d )
    {
    }

    void print(int const& i) const
    {
        std::cout << i << std::endl;
    }

    void new_component_name ( std::string::iterator const b, std::string::iterator const e) const
    {
        cout << "new component name" << endl;
    }

我可以从int_ token调用“print”函数,但是我无法从string_ token调用new_component_name。

我收到以下错误:boost / include / boost / bind / bind.hpp:397:9:没有匹配函数来调用'const boost :: _ mfi :: cmf2&gt;类型的对象,std: :__ 1 :: __ wrap_iter,std :: __ 1 :: __ wrap_iter&gt;'

我已经尝试了迭代器对参数以及“std :: string&amp; s const”参数。

1 个答案:

答案 0 :(得分:0)

您需要使用phoenix bind(使用qi占位符)

namespace phx = boost::phoenix;

component_ = (lit( '-' ) >> string_)
       [phx::bind( &SemanticActionsType::new_component_name, &actions_, qi::_1, qi::_2 )];

注意添加的括号(!),否则该SA只会附加到string_规则。

如果您还没有使用它,我建议您使用推荐的

#define BOOST_SPIRIT_USE_PHOENIX_V3

解决了Spirit语义操作的许多不稳定问题(有时甚至需要编译最近编译器上的示例)。