解析为x3 :: variant时发生编译器错误

时间:2018-09-08 17:47:00

标签: c++ boost-spirit-x3

我正在或多或少地使用X3进行第一步,并且已经设法解析具有2个成员的简单结构。但是我无法将此结构放入变体中。

(简化的)代码如下所示:

struct Command1
{
            CommandType type;
            std::string objName;
}
BOOST_FUSION_ADAPT_STRUCT(
    Command1,
    type, objName
);

struct Nil {};
using Command = x3::variant<Nil, Command1>;

const x3::rule<struct create_cmd_rule, Command1> ccRule = "ccRule";
const auto ccRule_def = typeRule > identifier;

const x3::rule<struct create_rule, Command> cRule = "cRule";
const auto cRule_def = x3::omit[x3::no_case["CREATE"]] > (ccRule_def);

如果我这样称呼

Command1 cmd;
x3::phrase_parse(statement.cbegin(), statement.cend(), parser::cRule_def, x3::space, cmd);

一切都很好。但是如果我通过我的变体:

Command cmd;
x3::phrase_parse(statement.cbegin(), statement.cend(), parser::cRule_def, x3::space, cmd);

它不能编译: 严重性代码说明项目文件行抑制状态 错误C2665'boost :: spirit :: x3 :: traits :: detail :: move_to':这4个重载都不能转换所有参数类型ZeusCore d:\ boost_1_67_0 \ boost \ spirit \ home \ x3 \ support \ traits \ move_to.hpp 224

我希望,我并没有将代码简化太多……

我正在使用boost 1.67和Visual Studio 2017的最新版本。

1 个答案:

答案 0 :(得分:0)

从您发布的内容来看,引用cRule_def时似乎出现了问题。 ccRule_defconst auto cRule_def = x3::omit[x3::no_case["CREATE"]] > (ccRule_def); 不是规则,它们只是链接存储在变量中的解析器。

尝试替换:

const auto cRule_def = x3::omit[x3::no_case["CREATE"]] > (ccRule);

BOOST_SPIRIT_DEFINE(cRule, ccRule);

具有:

Command1 cmd;
x3::phrase_parse(statement.cbegin(), statement.cend(), parser::cRule, x3::space, cmd);

并这样称呼它:

x3::omit

这是一个玩具工作示例,我曾尝试尝试复制错误https://wandbox.org/permlink/BMP5zzHxPZo7LUDi

其他说明:x3::omit[x3::no_case["CREATE"]]中的x = [[15.0, 14.0, 13.0], [11.0, 7.0, 8.0], [4.0, 1.0, 3.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] 是多余的。