【发布时间】:2013-11-18 08:36:54
【问题描述】:
我遇到了 Spirit Qi 的编译问题,它抱怨 value_type 不是 identifier 的成员。由于某种原因,Qi 的属性系统将标识符视为容器类型,并尝试枚举其值类型。
这与this question 中的问题类似,但是,我认为原因是单个成员结构,可能与此bug 有关。
#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,仅使用序列解析器,可以正确编译(并执行)。
有人知道正确的解决方案吗?
也请查看live example
【问题讨论】:
标签: c++ boost-spirit boost-spirit-qi boost-fusion