下面的代码使用boost::spirit,用于boost 1.44和boost 1.49:
qi::string("a_token")
[
boost::phoenix::bind(&node_t::some_func, *qi::_val, true)
]
我将boost更新到了1.53版,但是现在这段代码不再编译了。g++抱怨
error: pointer to member type 'void (node_t::)(bool)' incompatible with object type 'boost::error_cant_deduce_type'
我想不出怎么修好它。下面的代码进行编译:
qi::string("a_token")
[
boost::phoenix::bind(&node_t::some_func, (node_t*)0, true)
]
所以我猜问题出在qi::val_上。boost::spirit的API是否改变了,或者我是否丢失了一个包含文件?
我使用的是g++4.7,带有--std=c++0x。
在这里,我尝试了一个小测试用例来重现这个问题。错误消息不一样(但仍然很大!),但问题再次出现在取消引用运算符上。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/shared_ptr.hpp>
struct node_t
{
void foo(bool){}
};
int main()
{
namespace qi = boost::spirit::qi;
boost::spirit::qi::rule
<
std::string::const_iterator,
boost::shared_ptr<node_t>(),
boost::spirit::ascii::space_type
> rule;
rule = qi::string("true")
[boost::phoenix::bind(&node_t::foo, *qi::_val, true)];
}
发布于 2013-03-06 19:13:59
这是从上面的有用的评论中得到的答案(感谢llonesmiz)。
当尝试在boost::shared_ptr
上使用取消引用运算符*时,在boost::shared_ptr
中所做的更改会影响旧版本的boost::pheonix
。
在包含boost::spirit
之前,可以将#define BOOST_SPIRIT_USE_PHOENIX_V3 1
添加到源代码中。
此外,一些包含,如#include <boost/spirit/home/phoenix/ ... >
将被删除,因为它将与spirit v3
冲突。相反,应包括诸如#include <boost/spirit/include/phoenix.hpp>
之类的文件。
https://stackoverflow.com/questions/15233565
复制