Путаница между заполнителями boost :: bind и boost :: phoenix

В документации boost :: spirit есть это важное предупреждение

Есть разные способы написания семантических действий для Spirit.Qi: используя простые функции, Boost.Bind , Boost.Lambda или Phoenix . Последний три позволяют использовать специальные заполнители для управления параметром размещение ( _1 , _2 и т. д.). У каждой из этих библиотек есть свои реализация заполнителей в разных пространствах имен. У тебя есть чтобы не смешивать заполнители с библиотекой, которой они не принадлежат и не использовать разные библиотеки при написании семантического действия.

Обычно для Boost.Bind используйте :: _ 1 , :: _ 2 и т. д. . (да, эти заполнители определены в глобальном пространстве имен).

Для Boost.Lambda используйте заполнители, определенные в пространстве имен boost :: lambda .

Для семантических действий, написанных с использованием Phoenix, используйте заполнители определено в пространство имен boost :: spirit . Обратите внимание, что все существующие заполнители для ваше удобство также доступно из пространства имен boost :: spirit :: qi

( документация )

Хорошо, поэтому я пишу этот код

template 
struct ruleset_grammar : qi::grammar
{
    template 
    ruleset_grammar(TokenDef const& tok)
      : ruleset_grammar::base_type(start)
    {

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

    qi::rule 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 boost::spirit::_1'
        with
        [
            Eval=boost::spirit::argument<0>
        ]
        or       'c:\program files\boost\boost_1_44\boost\bind\placeholders.hpp(43) : boost::arg `anonymous-namespace'::_1'
        with
        [
            I=1
        ]

Как исправить эту ошибку компилятора?

5
задан sehe 19 February 2013 в 23:59
поделиться