Я написал рабочий парсер токенов на основе кода, показанного на spirit lex, пример 4
Одно из моих правил выглядит так
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
std::cout << val("set name statement to: ") << _3 << "\n"
]
;
Это хорошо работает. При представлении
SET NAME xyz
он выводит, как я ожидал
установить оператор имени на: xyz
Теперь я хочу сделать что-нибудь полезное, сохранить найденное имя в классе. Работа с семантическими примерами синтаксического анализатора я пишу этот код
class writer
{
public:
void print(string const& s) const
{
std::cout << s << std::endl;
}
};
writer w;
...
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
boost::bind( &writer::print, &w, ::_3 )
]
;
Это не компилируется
1>C:\Program Files\boost\boost44\boost/bind/bind.hpp(318) : error C2664: 'R boost::_mfi::cmf1::operator ()(const U &,A1) const' : cannot convert parameter 2 from 'bool' to 'const std::basic_string ' 1> with 1> [ 1> R=void, 1> T=eCrew::rule::writer, 1> A1=const std::string &, 1> U=eCrew::rule::writer * 1> ] 1> and 1> [ 1> _Elem=char, 1> _Traits=std::char_traits, 1> _Ax=std::allocator 1> ] 1> Reason: cannot convert from 'bool' to 'const std::string' 1> No constructor could take the source type, or constructor overload resolution was ambiguousset_name = ( tok.set_ >> tok.name_ >> tok.identifier ) [ std::cout << val("set name statement to: ") << _3 << "\n" ] ;
Почему компилятор жалуется на попытку преобразования из bool в строку? Я не вижу никакого bool.