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 が変更されたのでしょうか、それともインクルード ファイルがありませんか?

--std=c++0x で g++4.7 を使用しています。

ここでは、問題を再現するために小さなテスト ケースを試しました。エラーメッセージは同じではありませんが (それでも大きいです!)、ここでも逆参照演算子が問題のようです。

#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 に答える