【发布时间】:2015-08-27 08:57:02
【问题描述】:
考虑:
struct s {
AttrType f(const std::string &);
};
...以及带有属性AttrType 的规则r:
template <typename Signature> using rule_t =
boost::spirit::qi::rule<Iterator,
Signature,
boost::spirit::qi::standard::space_type>;
rule_t<AttrType()> r;
r = lexeme[alnum >> +(alnum | char_('.') | char_('_'))][
_val = boost::phoenix::bind(&s::f, s_inst, _1)
];
编译时(使用 clang),我收到以下错误消息:
boost/phoenix/bind/detail/preprocessed/member_function_ptr_10.hpp:28:72: error: no viable conversion from
'boost::fusion::vector2<char, std::__1::vector<char, std::__1::allocator<char> > >' to 'const std::__1::basic_string<char>'
return (BOOST_PROTO_GET_POINTER(class_type, obj)->*fp)(a0);
^~
我的印象是占位符变量_1 的类型有问题。为此目的,有没有一种简洁的方法可以将lexeme 的属性转换为std::string?
如果我插入一个属性类型为std::string 的附加规则,它会编译:
rule_t<std::string()> r_str;
r = r_str[boost::phoenix::bind(&s::f, s_inst, _1)];
r_str = lexeme[alnum >> +(alnum | char_('.') | char_('_'))];
...但这似乎有点尴尬。有没有更好的办法?
【问题讨论】:
标签: c++ boost boost-spirit boost-spirit-qi boost-phoenix