使用 BOOST_FUSION_ADAPT_ADT 调整类时出错

2023-12-14

我有以下课程:

#ifndef WFRACTAL_FRACTAL_METADATA_H_
#define WFRACTAL_FRACTAL_METADATA_H_

#include <string>

namespace WFractal {
namespace Fractal {

class Metadata {

public:

    void setAuthorName(const std::string &name);
    void setAuthorEMail(const std::string &email);
    void setBriefDescription(const std::string &brief);
    void setCompleteDescription(const std::string &description);
    std::string getAuthorName() const;
    std::string getAuthorEMail() const;
    std::string getBriefDescription() const;
    std::string getCompleteDescription() const;

public:

    bool operator==(const Metadata &other);

private:

    std::string m_name;
    std::string m_email;
    std::string m_brief;
    std::string m_description;
};

} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_METADATA_H_

我想使用解析它boost::spirit来自以下文件内容:

metadata {
  author = "Me";
  email = "myemail";
  brief = "brief description";
  description = "complete description";
}

我读过这一页我可以用BOOST_FUSION_ADAPT_STRUCT为了解析它。这是我的语法模板:

#ifndef WFRACTAL_FRACTAL_PARSER_METADATAGRAMMAR_H_
#define WFRACTAL_FRACTAL_PARSER_METADATAGRAMMAR_H_

#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/spirit/include/qi_no_case.hpp>
#include <string>
#include "Fractal/Metadata.h"

BOOST_FUSION_ADAPT_ADT(
    WFractal::Fractal::Metadata,
    (obj.getAuthorName(), obj.setAuthorName(val))
    (obj.getAuthorEMail(), obj.setBriefDescription(val))
    (obj.getBriefDescription(), obj.setCompleteDescription(val))
    (obj.getCompleteDescription(), obj.setAuthorEMail(val))
)

namespace WFractal {
namespace Fractal {
namespace Parser {

template <typename Iterator>
struct MetadataParser : boost::spirit::qi::grammar<Iterator, Metadata(), boost::spirit::ascii::space_type> {
    MetadataParser() : MetadataParser::base_type(start) {
        using boost::spirit::qi::int_;
        using boost::spirit::qi::lit;
        using boost::spirit::qi::double_;
        using boost::spirit::qi::lexeme;
        using boost::spirit::ascii::char_;
        using boost::spirit::ascii::no_case;

        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

        start %=
        no_case[lit("metadata")]
        >> '{'
        >>  no_case[lit("author")] >> '=' >> quoted_string >> ';'
        >>  no_case[lit("email")] >> '=' >> quoted_string >> ';'
        >>  no_case[lit("brief")] >> '=' >> quoted_string >> ';'
        >>  no_case[lit("description")] >> '=' >> quoted_string >> ';'
        >>  '}'
        ;
    }

    boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> quoted_string;
    boost::spirit::qi::rule<Iterator, Metadata(), boost::spirit::ascii::space_type> start;
};

} // namespace Parser
} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_PARSER_METADATAGRAMMAR_H_

当我创建此语法的实例时(始终遵循页面示例),我收到编译器错误:

typedef string::const_iterator StringIterator;
typedef Parser::MetadataParser<StringIterator> MetadataParser;
MetadataParser parser;

我收到了很多错误(典型的 boost...),并且我注意到其中有许多此错误的副本:

src/Fractal/FileFactory.cpp:27:17:   required from here
/usr/include/boost/spirit/home/qi/detail/assign_to.hpp:152:18: error: no matching function for call to ‘boost::fusion::extension::adt_attribute_proxy<WFractal::Fractal::Metadata, 0, false>::adt_attribute_proxy(const std::__cxx11::basic_string<char>&)’
             attr = static_cast<Attribute>(val);

我做错了什么?我该如何修复它?

EDIT

正如女士建议的那样我已经添加了#include <boost/spirit/include/support_adapt_adt_attributes.hpp>标题,但这不起作用。

#ifndef WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_
#define WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
#include <boost/spirit/include/support_adapt_adt_attributes.hpp>
#include <string>
#include "Fractal/Metadata.h"

BOOST_FUSION_ADAPT_ADT(
    WFractal::Fractal::Metadata,
    (obj.getAuthorName(), obj.setAuthorName(val))
    (obj.getAuthorEMail(), obj.setAuthorEMail(val))
    (obj.getBriefDescription(), obj.setBriefDescription(val))
    (obj.getCompleteDescription(), obj.setCompleteDescription(val))
)

namespace WFractal {
namespace Fractal {
namespace Parser {

template <typename Iterator>
struct MetadataParser : boost::spirit::qi::grammar<Iterator, Metadata(), boost::spirit::ascii::space_type> {
    MetadataParser() : MetadataParser::base_type(start) {
        using boost::spirit::qi::lit;
        using boost::spirit::qi::lexeme;
        using boost::spirit::ascii::char_;
        using boost::spirit::ascii::no_case;

        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

        start %=
        no_case[lit("metadata")]
        >> '{'
        >> ((no_case[lit("author")] >> '=' >> quoted_string >> ';')
        ^  (no_case[lit("email")] >> '=' >> quoted_string >> ';')
        ^  (no_case[lit("brief")] >> '=' >> quoted_string >> ';')
        ^  (no_case[lit("description")] >> '=' >> quoted_string >> ';'))
        >>  '}'
        ;
    }

    boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> quoted_string;
    boost::spirit::qi::rule<Iterator, Metadata(), boost::spirit::ascii::space_type> start;
};

} // namespace Parser
} // namespace Fractal
} // namespace WFractal

#endif // !WFRACTAL_FRACTAL_PARSER_METADATAPARSER_H_

Hmm.

经过与 Modular Boost 和 git 的长期斗争之后......我发现这是一种回归。

此拉取请求已部分修复了回归问题:

  • 重新启用对 BOOST_FUSION_ADAPT_ADT 适应结构的支持 #153

遗憾的是,在存在排列解析​​器的情况下它仍然被破坏。我测试过BOOST_FUSION_ADAPT_STRUCT以验证它没有以其他方式损坏。

我会将减少的样本添加到 PR 中以征求意见。同时,这是独立的再现器:

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted.hpp>
#include <iostream>

class Foo {
  public:
    char const& getA() const { return a; } 
    char const& getB() const { return b; } 

    void setA(char value)    { a = value; } 
    void setB(char value)    { b = value; } 
  private:
    char a, b;
};

BOOST_FUSION_ADAPT_ADT(
        Foo,
        (char const&, char const&, obj.getA(), obj.setA(val))
        (char const&, char const&, obj.getB(), obj.setB(val))
    )


int main() {
    namespace qi = boost::spirit::qi;

    boost::spirit::istream_iterator f(std::cin), l; // input e.g. "a=a;b=b;"
    Foo foo;

    bool r = qi::parse(f, l,
#if 0 // FAILS TO COMPILE
                      ("a=" >> qi::char_ >> ';')
                    ^ ("b=" >> qi::char_ >> ';')
#else // COMPILES WITH FIX FROM PR #153
                      ("a=" >> qi::char_ >> ';')
                   >> ("b=" >> qi::char_ >> ';')
#endif 
                , foo);

    if (r)
        std::cout << "Parsed: " << boost::fusion::as_vector(foo) << "\n";
    else
        std::cerr << "Parse failed\n";
}

但是,如果您更改#if 1 to #if 0,你得到输出:

Parsed: (a b)

Note当然,这是假设您使用应用了 PR 153 的分支。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BOOST_FUSION_ADAPT_ADT 调整类时出错 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 图像在悬停时移动 - 铬不透明度问题

    我的页面似乎有问题 http www lonewulf eu 当鼠标悬停在缩略图上时 图像会向右移动一点 并且这种情况仅发生在 Chrome 上 My css img ms filter progid DXImageTransform Mi
  • 没有 cookie 的 Laravel 会话

    我有一个应用程序 允许用户登录并将商品添加到购物篮 但是如果用户关闭了 cookie 则此功能将不再起作用 我检查过 Facebook 结果发现他们也需要启用 cookie 才能正常工作 所以我的问题是 是否可以在没有 cookie 的情况
  • 验证 Firebase 键是否为整数

    这是数据库架构 规则如下 notifications year read false write data exists month read false write data exists day read false write dat
  • 仅根据索引计算第 N 个多重集组合(具有重复)

    我怎样才能仅根据它的索引来计算第 N 个组合 应该有 n k 1 k n 1 种重复组合 with n 2 k 5 you get 0 0 0 0 0 0 1 0 0 0 0 1 2 0 0 0 1 1 3 0 0 1 1 1 4 0 1
  • 构建后事件执行 PowerShell

    是否可以使用构建后事件设置 NET 项目来执行 powershell 脚本 我正在使用这个脚本来生成一些文件 我还可以将它是调试版本还是发布版本传递给脚本 举一个这样的例子就太好了 这是一个例子 首先 您必须意识到必须配置 PowerShe
  • 检查卸载前是否保存了更改

    我有以下 JavaScript 编辑 包含更改已保存的分配 var changesSaved true document ready function applyChanges click function e e preventDefau
  • HttpClient 正在发送额外的 cookie

    运行 UWP 应用 所以我有一个 HttpClient 及其关联的处理程序 我正在向网站发出请求 传入指定的标头 并使用指定的 CookieContainer 该 CookieContainer 在请求开始时为空 当我发送请求时 Fiddl
  • 如何抑制Spyder编辑器中的某个警告?

    在我输入该行后 Spyder 中的编辑器总是立即向我发出有关未使用的导入 变量的警告 我想抑制这样的警告 我怎么做 我希望我在 Spyder 编辑器中打开的每个文件都发生这种情况 不喜欢本地修复 我尝试添加 disable pylintrc
  • 设置名称时抛出异常

    我在设置名称时遇到强制转换异常 Object customers customerRepository getCustomerName Id Customer row new Customer row setName String cust
  • 是否可以使用标准库在 Go 中嵌套模板?

    如何在 python 运行时中获取像 Jinja 那样的嵌套模板 TBC 我的意思是如何让一堆模板从基本模板继承 只需归档基本模板块 就像 Jinja django templates 所做的那样 是否可以只使用html template在
  • 如何从 qdateEdit 获取用户输入并从 postgres 的数据库中选择它

    我想知道如何在 QDateEdit 中获取用户输入并在 postgres 的表中选择它 这是我的代码 def date self try date self dateEdit date print date conn psycopg2 co
  • 如何将 std::sort 与结构向量和比较函数一起使用?

    谢谢你的C 中的解决方案 现在我想使用 std sort 和向量在 C 中实现这一点 typedef struct double x double y double alfa pkt vector lt pkt gt wektor 使用pu
  • 如何在R中找到超过10个变量的第二、第三和第n最大行?

    我有一个包含 20 个变量的数据集 我需要使用其中的 10 个变量来查找第一个 第二个 第三个 第 n 个最大值 变量是x1 to x10 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 1 2 0 3 4 5 6 7 8 5
  • 全局临时表 - SQL Server 与 Oracle

    我使用 Oracle 11g 全局临时表 因为我需要一个解决方案 可以将行添加到临时表中以进行联接 并且我只希望添加到临时表中以包含 Oracle 连接 会话的行 我在 Oracle 中使用全局临时表 因为我希望该表存在于会话之间 这样就不
  • 检查每个进程和子进程的内存

    我试图创建一个脚本来显示 mysqld 的每个进程和子进程的使用量 您可以在我的代码中看到我做了什么 bin bash file contains the output of pstree mysql a p awk print 1 sed
  • Astar 可以多次访问节点吗?

    我一直在阅读维基百科的 Astararticle 在他们的实现中 他们检查每个节点是否在closed设置 如果是这样 他们会跳过它 是不是有可能 如果启发式是可以接受的 但是NOT一致 我们可能需要重新访问一个节点两次 或更多次 才能改进它
  • 注册 Office.EventType.ItemChanged 时 Outlook WebAddin 引发内部服务器错误

    在我的 Outlook WebAddin 中 我尝试使用以下代码注册邮件 ItemChange 事件 Office context mailbox addHandlerAsync Office EventType ItemChanged m
  • cygwin pthread_mutex_timedlock 代理

    不幸的是 cygwin GCC 4 5 3 pthread 库实现不支持 POSIX 标准函数 int pthread mutex timedlock pthread mutex t mutex struct timespec abstim
  • Colorbox 和通过 ajax 返回的内容

    我正在使用 jquery colorbox 在窗口中弹出用户帐户 我还有一个按钮 可以通过 ajax 将更多用户加载到页面中 但由于某种原因 使用 ajax 加载的用户不会在彩盒窗口中弹出 如何让 colorbox 处理通过 ajax 返回
  • 使用 BOOST_FUSION_ADAPT_ADT 调整类时出错

    我有以下课程 ifndef WFRACTAL FRACTAL METADATA H define WFRACTAL FRACTAL METADATA H include