我的语法部分如下:
typedef SemanticActions< IterType > SemanticActionsType;
string_ %= lexeme[ +( spirit::qi::alnum | punct )];
component_ = lit( '-' ) >> string_[boost::bind( &SemanticActionsType::new_component_name, &actions_, _1, _2 )]
和相应的语义动作类:
template< typename IterType >
class SemanticActions
{
public:
SemanticActions( Design_p d ) : design_( d )
{
}
void print(int const& i) const
{
std::cout << i << std::endl;
}
void new_component_name ( std::string::iterator const b, std::string::iterator const e) const
{
cout << "new component name" << endl;
}
我可以从int_ token调用“print”函数,但是我无法从string_ token调用new_component_name。
我收到以下错误:boost / include / boost / bind / bind.hpp:397:9:没有匹配函数来调用'const boost :: _ mfi :: cmf2&gt;类型的对象,std: :__ 1 :: __ wrap_iter,std :: __ 1 :: __ wrap_iter&gt;'
我已经尝试了迭代器对参数以及“std :: string&amp; s const”参数。
答案 0 :(得分:0)
您需要使用phoenix bind(使用qi占位符)
namespace phx = boost::phoenix;
component_ = (lit( '-' ) >> string_)
[phx::bind( &SemanticActionsType::new_component_name, &actions_, qi::_1, qi::_2 )];
注意也添加的括号(!),否则该SA只会附加到string_
规则。
如果您还没有使用它,我建议您使用推荐的
#define BOOST_SPIRIT_USE_PHOENIX_V3
解决了Spirit语义操作的许多不稳定问题(有时甚至需要编译最近编译器上的示例)。