【问题标题】:Cannot phoenix::bind qi::_val with boost 1.53 (regression ?)不能 phoenix::bind qi::_val 与 boost 1.53(回归?)
【发布时间】: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&lt;node_t&gt;() 会出现原始错误。在包含标头 makes it compile 之前定义 BOOST_SPIRIT_USE_PHOENIX_V3。
  • @llonesmiz 哇。您为什么不将其发布为答案?
  • 问题似乎是phoenix v2类型推导期望shared_ptr具有referencevalue_type作为内部typedef,它们在1.53版中被删除。如果出于某种原因您不想使用 BOOST_SPIRIT_USE_PHOENIX_V3,this really ugly hack 似乎也可以。

标签: c++ boost boost-spirit boost-phoenix


【解决方案1】:

这是从上面有用的 cmets 中得出的答案(感谢 llonesmiz)。

当尝试在 boost::shared_ptr 上使用取消引用运算符 * 时,boost::shared_ptr 中所做的更改会影响旧版本的 boost::pheonix

在包含boost::spirit 之前,可以将#define BOOST_SPIRIT_USE_PHOENIX_V3 1 添加到源中。

另外,一些包含如#include &lt;boost/spirit/home/phoenix/ ... &gt; 将被删除,因为它会与spirit v3 冲突。而是包含#include &lt;boost/spirit/include/phoenix.hpp&gt; 等文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多