不能phoenix :: bind qi :: _ val with boost 1.53(回归?)

时间:2013-03-05 20:34:45

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

下面的代码,使用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)];
}

1 个答案:

答案 0 :(得分:4)

这是上述有用评论的答案(感谢llonesmiz)。

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

在加入boost::spirit之前,#define BOOST_SPIRIT_USE_PHOENIX_V3 1可以添加到来源。

此外,还有一些包含#include <boost/spirit/home/phoenix/ ... >等要删除的内容,因为它会与spirit v3冲突。而是包含#include <boost/spirit/include/phoenix.hpp>等文件。