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 は、シーケンス パーサーのみを使用して、正しくコンパイル (および実行) されます。
誰かがこれに対する適切な解決策を知っていますか?
実際のサンプルもご覧ください