boost :: bind和boost :: phoenix占位符之间的混淆

时间:2011-03-27 16:25:35

标签: c++ boost boost-spirit

boost::spirit文档有这个重要警告

  

为Spirit.Qi编写语义操作有不同的方法:使用   普通函数,Boost.BindBoost.LambdaPhoenix。后者   三允许您使用特殊占位符来控制参数   展示位置(_1_2等)。每个库都有它自己的   占位符的实现,都在不同的命名空间中。你有   确保不将占位符与他们不属于的库混合   在编写语义动作时不要使用不同的库。

     

通常,对于Boost.Bind,请使用::_1::_2等(是的,这些占位符是   在全局命名空间中定义。)

     

对于Boost.Lambda,请使用命名空间boost::lambda中定义的占位符。

     

对于使用Phoenix编写的语义操作,请使用中定义的占位符   命名空间boost::spirit。请注意所有现有的占位符   您可以从名称空间boost::spirit::qi

中获得方便

documentation

好的,所以我写了这段代码

template <typename Iterator>
struct ruleset_grammar : qi::grammar<Iterator>
{
    template <typename TokenDef>
    ruleset_grammar(TokenDef const& tok)
      : ruleset_grammar::base_type(start)
    {

        start =  *(  tok.set_name [ boost::bind( &cRuleSet::setName, &theRuleSet, ::_1 ) ]
                  )
              ;
    }

    qi::rule<Iterator> start;
};

请注意使用::_1

但是,我仍然遇到此编译器错误

c:\documents and settings\james\spirit_test.cpp(138) : error C2872: '_1' : ambiguous symbol
        could be 'c:\program files\boost\boost_1_44\boost\spirit\home\support\argument.hpp(124) : const boost::phoenix::actor<Eval> boost::spirit::_1'
        with
        [
            Eval=boost::spirit::argument<0>
        ]
        or       'c:\program files\boost\boost_1_44\boost\bind\placeholders.hpp(43) : boost::arg<I> `anonymous-namespace'::_1'
        with
        [
            I=1
        ]

如何修复此编译器错误?

1 个答案:

答案 0 :(得分:7)

您是否可以在该文件顶部的某处写一个using namespace boost::spirit;?因为如果是,精神和绑定占位符现在都在全局命名空间中。直接使用qi::可能会支持我的假设,但这可能也很简单namespace qi = boost::spirit::qi