我正在或多或少地使用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的最新版本。
答案 0 :(得分:0)
从您发布的内容来看,引用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);
并这样称呼它:
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]]
是多余的。