9

value_typeがidentifierのメンバーではないことを訴える Spirit Qi のコンパイルの問題があります。何らかの理由で、Qi の属性システムは識別子をコンテナー型と見なし、その値型を列挙しようとします。

これはこの質問と同様の問題ですが、原因は単一メンバーの構造体であり、このバグに関連している可能性があると思います。

#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

using namespace boost::spirit::qi; 

struct identifier
{
    std::wstring name;
};

struct problem
{
    identifier _1;
    identifier _2;
    identifier _3;
};

BOOST_FUSION_ADAPT_STRUCT(
    identifier,
    (std::wstring, name)
)

BOOST_FUSION_ADAPT_STRUCT(
    problem,
    (identifier, _1)
    (identifier, _2)
    (identifier, _3)
)



int main(int argc, char* argv[])
{
    rule<std::wstring::const_iterator, identifier()> gr_identifier = eps >> raw[lexeme[(alpha | '_') >> *(alnum | '_')]];

    // Ok, compiles
    /*rule<std::wstring::const_iterator, problem()> gr_problem =       gr_identifier
                                                                  >> gr_identifier
                                                                  >> '('
                                                                  >>   gr_identifier
                                                                  >>   ')';*/
    // Fails
    rule<std::wstring::const_iterator, problem()> gr_problem =       gr_identifier
                                                                  >> gr_identifier
                                                                  >> '('
                                                                  >   gr_identifier
                                                                  >   ')';

    std::wstring input = L"foo goo(hoo)";
    /*bool dummy = phrase_parse(
            input.begin(), input.end(), 
            gr_problem,
            space);*/

    return EXIT_SUCCESS;
}

興味深いことに、これは期待パーサーを使用する場合にのみ発生します (例の定義 2 を参照)。定義 1 は、シーケンス パーサーのみを使用して、正しくコンパイル (および実行) されます。

誰かがこれに対する適切な解決策を知っていますか?

実際のサンプルもご覧ください

4

1 に答える 1