【发布时间】:2013-03-05 20:34:44
【问题描述】:
下面的代码,使用 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)];
}
【问题讨论】:
-
你能添加一个简单的完整示例来重现错误吗?
-
忘了说:_val 应该是一个 shared_ptr
。我会尝试做一个简单的测试用例。 -
在规则签名中使用
boost::shared_ptr<node_t>()会出现原始错误。在包含标头 makes it compile 之前定义 BOOST_SPIRIT_USE_PHOENIX_V3。 -
@llonesmiz 哇。您为什么不将其发布为答案?
-
问题似乎是phoenix v2类型推导期望shared_ptr具有
reference和value_type作为内部typedef,它们在1.53版中被删除。如果出于某种原因您不想使用 BOOST_SPIRIT_USE_PHOENIX_V3,this really ugly hack 似乎也可以。
标签: c++ boost boost-spirit boost-phoenix