1

フェニックスコード[a()、b()]が与えられた場合、正しい動作はそれぞれa()、次にb()と呼ばれると思いますが、明らかにboost 1.47では2番目の関数のみが呼び出されます。以下のコードを参照してください。

struct employee_parser : qi::grammar<Iterator, employee(), ascii::space_type>
{
    employee_parser() : employee_parser::base_type(start)
    {
        using qi::int_;
        using qi::lit;
        using qi::double_;
        using qi::lexeme;
        using ascii::char_;

        using ascii::string;
        using namespace qi::labels;            
        using boost::phoenix::ref;
        using boost::phoenix::val;

        quoted_string %= (lexeme['"' >> +(char_ - '"') >> '"' ]) ;

        start %= (
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  quoted_string [std::cout<<ref(text1)<<" \n",ref(text1) = _1]  >> ',' 
            >>  quoted_string >> ','
            >>  double_
            >>  '}'  )                
            ;
    }

    qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
    qi::rule<Iterator, employee(), ascii::space_type> start;
    std::string text1;
};

なぜ最初の部分が呼び出されないのですか? それはバグであり、最新のブーストライブラリで修正されていますか?

std::cout<<ref(text1)<<" \n"
4

1 に答える 1

3

おそらく明示的に含める必要があります

#include <boost/spirit/include/phoenix_operator.hpp>

以前は、メインの Phoenix ヘッダーをインクルードしても、この必須ヘッダーを取り込めないバージョンのブーストがありました。

最近のバージョンでは、これは必要なくなりました。そして、一般的に、それ以降のバージョンでは Phoenix V3 に切り替えることをお勧めします。

#define BOOST_SPIRIT_USE_PHOENIX_V3

Phoenix V3 にはより多くの機能があり、より優れた (c++11) 相互運用性があり、Phoenix V2 よりも一般的に進化しています。

于 2013-10-22T20:46:51.843 に答える