【发布时间】:2011-07-25 14:43:12
【问题描述】:
我已经根据spirit lex example 4 中显示的代码编写了一个工作令牌解析器
我的一条规则如下所示
set_name
= ( tok.set_ >> tok.name_ >> tok.identifier )
[
std::cout << val("set name statement to: ") << _3 << "\n"
]
;
这很好用。当出现
SET NAME xyz
它按我的预期输出
设置名称语句为:xyz
现在我想做一些有用的事情,将找到的名称存储到一个类中。在parser semantic examples工作,我写了这段代码
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\boost_1_44\boost/bind/bind.hpp(318) : 错误 C2664: 'R boost::_mfi::cmf1::operator ()(const U &,A1) const' :无法将参数 2 从 'bool' 转换为 'const std::basic_string' 1> 与 1> [ 1> R=空, 1> T=eCrew::rule::writer, 1> A1=const std::string &, 1> U=eCrew::rule::writer * 1>] 1> 和 1> [ 1> _Elem=字符, 1> _Traits=std::char_traits, 1> _Ax=std::分配器 1>] 1> 原因:无法从 'bool' 转换为 'const std::string' 1> 没有构造函数可以采用源类型,或者构造函数重载决议不明确为什么编译器会抱怨试图从 bool 转换为 string?我看不到布尔值。
【问题讨论】:
-
In ... w 是否被重新声明为布尔值?如果为 writer 使用更独特的变量名会发生什么?
-
@jon 将“w”更改为“the_writer”。结果相同。
标签: c++ boost boost-spirit boost-bind