Путаница между boost :: bind и boost :: phoenix заполнителями - PullRequest
5 голосов
/ 27 марта 2011

В документации 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 <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 Ответ

7 голосов
/ 27 марта 2011

Возможно, вы написали using namespace boost::spirit; где-нибудь вверху этого файла? Потому что если да, то и дух, и заполнители связывания теперь находятся в глобальном пространстве имен. Прямое использование qi:: может поддержать мое предположение, но это также может быть простой namespace qi = boost::spirit::qi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...