3

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

1 回答 1

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>.

于 2013-03-06T19:13:58.767 回答