Разбираюсь с boost::spirit. Остановился на этой странице:
http://www.boost.org/doc/libs/1_55_0/libs/spirit/doc/html/spirit/qi/tutorials/mini_xml___asts_.html.
Пытаюсь скомпилить первый пример, а именно вот этот:
http://www.boost.org/doc/libs/1_55_0/libs/spirit/example/qi/mini_xml1.cpp
На строке грамматики:
template <typename Iterator>
struct mini_xml_grammar : qi::grammar<Iterator, mini_xml(), ascii::space_type>
{
mini_xml_grammar() : mini_xml_grammar::base_type(xml)
{
...............................
xml =
start_tag [at_c<0>(_val) = _1] // <-- вот тут
>> *node [push_back(at_c<1>(_val), _1)]
>> end_tag(at_c<0>(_val))
;
}
Он не компилится по причине:
1>------ Build started: Project: BoostSpirit, Configuration: Debug Win32 ------
1> QiBases.cpp
1>с:\dev\learning\boostspirit\src\boostspiritlearning\qibases.cpp(778): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const boost::spirit::attribute<N>' (or there is no acceptable conversion)
1> with
1> [
1> N=0
1> ]
1> с:\libs\boost_1_51_0\boost\spirit\home\support\context.hpp(195): could be 'boost::spirit::attribute<N> &boost::spirit::attribute<N>::operator =(const boost::spirit::attribute<N> &)'
1> with
1> [
1> N=0
1> ]
1> while trying to match the argument list '(const boost::spirit::attribute<N>, const boost::spirit::_1_type)'
1> with
1> [
1> N=0
1> ]
1> с:\dev\learning\boostspirit\src\boostspiritlearning\qibases.cpp(749) : while compiling class template member function 'clientN::mini_xml_grammar<Iterator>::mini_xml_grammar(void)'
1> with
1> [
1> Iterator=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>
1> ]
1> с:\dev\learning\boostspirit\src\boostspiritlearning\qibases.cpp(799) : see reference to class template instantiation 'clientN::mini_xml_grammar<Iterator>' being compiled
1> with
1> [
1> Iterator=std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Почему не компилится? Что не так с атрибутом? Вроде по логике всё правильно.
Как поправить пример, чтобы он собирался?
Потому, что нужно правильно неймспейсы разруливать и не мешать в кучу такие вещи как например: fusion и spirit::fusion.
Если нормально разрулит ь — то и проблем не будет.