我正在或多或少地使用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的最新版本。

最佳答案

从您发布的内容来看,似乎在引用*_def时出现了问题。 cRule_defccRule_def而不是规则,它们只是链接存储在变量中的解析器。

尝试更换:

const 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);

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

其他说明:x3::omit中的x3::omit[x3::no_case["CREATE"]]是多余的。

关于c++ - 解析为x3::variant时发生编译器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52237856/

10-15 13:28