В документации 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
]
Как мне исправить эту ошибку компилятора?