gpt4 book ai didi

c++ - 解析为 x3::variant 时出现编译器错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:51 24 4
gpt4 key购买 nike

我或多或少地完成了 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\移动到.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::no_case["CREATE"]] 中的 x3::omit 是多余的。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com