我正在或多或少地使用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_def
和ccRule_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/