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