使用声明的可变基类无法在 MSVC 中编译

2024-03-07

我正在尝试实现一个可变访问者类。

template<typename T>
class VisitorBaseFor {
protected:
   virtual ~VisitorBaseFor() = default;

public:
   virtual void visit(T &t) = 0;
};

template<typename... Ts>
class VisitorBase : public VisitorBaseFor<Ts>... {
public:
    using VisitorBaseFor<Ts>::visit...;
};

我知道从那个超载技巧 https://dev.to/tmr232/that-overloaded-trick-overloading-lambdas-in-c17可变参数 using 声明应该是可能的,但是 MSVC 不编译我的代码,说我需要扩展 Ts,而 GCC 和 Clang 编译我的代码没有错误,请参阅here https://godbolt.org/z/7P-voB.

我缺少什么?这是 MSVC 错误还是(尚未)受支持?如果是的话,有没有办法解决这个问题?

除此之外,我尝试删除 using 声明,但随后对访问的调用由于某种原因变得不明确,即使 T 中的所有类都不能相互转换。 MSVC 正确诊断了这一点,但为什么它们甚至用于重载解析呢?

更新:这是至少自 2018 年 9 月 3 日起的已知错误。请参阅here https://developercommunity.visualstudio.com/content/problem/338188/pack-expansion-in-using-declarations-fails-with-te.html and here https://developercommunity.visualstudio.com/content/problem/326608/variadic-using-declarations-for-inheriting-constru.html.


代码确实是正确的,所以 msvc 的错误。

解决方法是手动执行递归:

template<typename T>
class VisitorBaseImpl {
protected:
    virtual ~VisitorBaseImpl() = default;

public:
    virtual void visit(T &t) = 0;
};

template<typename... Ts> class VisitorBase;

template<typename T>
class VisitorBase<T> : public VisitorBaseImpl<T>
{
};

template<typename T, typename... Ts>
class VisitorBase<T, Ts...> : public VisitorBase<T>, public VisitorBase<Ts...>
{
public:
    using VisitorBase<T>::visit;
    using VisitorBase<Ts...>::visit;
};

Demo https://godbolt.org/z/KvoWl3

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

使用声明的可变基类无法在 MSVC 中编译 的相关文章

随机推荐

  • 账户与azure AD关联后如何从Alexa获取accesstoken

    我尝试将 Alexa AWS Lambda 函数 node js 6 10 与 Azure Active Directory 连接到我的 Azure Cloud API 读完后文档 https developer amazon com do
  • 部署后出现 Angular 的“未捕获错误:[$injector:unpr]”

    我有一个相当简单的 Angular 应用程序 它在我的开发机器上运行得很好 但在部署它后失败并显示此错误消息 在浏览器控制台中 Uncaught Error injector unpr http errors angularjs org u
  • 带 ref/Pointer 参数的 C# 反射调用方法

    我想通过反射调用类的每个方法 但无法使用指针作为引用来调用方法 通常我可以为我找到的每个指针传递 null 一切都会好起来的 问题是当函数尝试访问我传递的指针时 该指针将是对内存地址 0 的引用 这显然对我的程序来说会立即崩溃 所以我需要传
  • Spring 集成 TCP

    我想设置 Spring TCP 服务器客户端应用程序 我需要一个服务器侦听端口上的传入消息 例如 6666 并且客户端在不同的端口上发送消息 例如 7777 我已遵循文档 http docs spring io spring integra
  • 在 cocoa/iPhone 中将纪元时间转换为 NSDate

    我有纪元时间的值 比如 123456789 现在我想将其转换为NSDate在可可框架中 谁能告诉我吗 thanks 文档 http developer apple com iphone library documentation Cocoa
  • 使用 Firestore,如何使用 java 类序列化文档中的引用类型字段?

    如果我有一个包含 引用 类型字段的 Firestore 文档 那么在使用自动 POJO Java 对象序列化时如何读取和写入该字段 POJO 类型字段文档参考 https firebase google com docs reference
  • WPF 相当于 TextRenderer

    我用过TextRenderer测量字符串的长度 从而适当调整控件的大小 WPF 中是否有等效项或者我可以简单地使用TextRendered MeasureString 谢谢纪修 阅读您的链接后 我想到了以下两个内容 它们都适合我
  • Python将整列添加到csv文件中,而不读取文件内容

    我需要使用 Python 将列添加到 csv 文件 我能想到的唯一方法是读取整个文件 编辑每一行以添加 1 个元素 然后再次写入文件 然而 我真的不想这样做 因为文件的大小 超过 32000 行 每次我想添加列时似乎需要大量的读写 即使使用
  • 如何从 fgets 中检测空字符串

    我试图将 stdin 中的 fgets 输入检测为空 当我按 Enter 键而不输入任何内容时 这是我的程序 int main char input 1000 printf Enter fgets input 1000 stdin inpu
  • 如何使用 box2d 在 libgdx 中拖动对象?

    我已将对象添加到box2d世界在libgdx 我想知道是否可以用鼠标拖动对象 如果是这样 怎么办 thanks 这里有几个选项 您可以使用鼠标关节 也可以使用运动体并手动设置其位置 看看如何使用鼠标关节的一个很好的例子 http code
  • 图像作为绘制形状的“背景”

    是否可以使用图像而不是颜色来 填充 HTML5 画布上的形状 我画了一堆形状 各个角以 45 度角切掉的正方形 我希望能够用图像而不是颜色来 填充 这些形状 目前我有一行指出 context fillStyle 123456 example
  • 如何使用 Meteor.js、Twitter 和 Oauth 发布推文

    我在使用 Meteor 和 Twitter 时遇到了一些问题 我想做的就是通过点击按钮发布一条推文 为此 我必须通过 Oauth 向 Twitter 服务验证自己的身份 目前 我正在以一种非常复杂的方式进行身份验证 从客户端到服务器并返回
  • 适用于 Android 的本机 OpenCV 示例抛出 UnsatisfiedLinkError

    我尝试在模拟器上运行 opencv android 示例 带有本机代码的示例 例如示例 教程 2 高级 1 添加本机 OpenCV 失败 我有一个Win7 x86系统 我可以构建本机库 但如果运行示例 我总是会遇到以下异常 10 04 08
  • 每个线程组的概率

    如果我的测试计划中有 3 个线程组 如何为每个组设置恒定概率 请求权重 我是 JMeter 的新手 您能在屏幕截图上显示您的设置吗 只需将每组的线程数设置为测试总线程数的一个因子即可 如果有 100 个 VU 则 g1 设置为 50 g2
  • 我如何使用 iOS 中的 Fabric 框架从我的应用程序中注销 Twitter

    在我的 iOS 应用程序中 我使用集成 Twitter 登录织物框架 TWTR作曲家 第一次登录并在 Twitter 上发布推文时 它工作正常 但我无法在我的应用程序中从 Twitter 注销 当我第二次尝试登录时 twitterlogin
  • LINQ 和递归

    考虑以下 public class Box public BoxSize Size get set public IEnumerable
  • 无法在 django 模板中使用 unicode 字符串

    我在 django 模板中使用了 B M N TO N 字符串 它引发了错误 utf8 编解码器无法解码位置 569 中的字节 0xd4 无效的连续字节 但是当我使用 BO MON TOAN 字符串时 它不会引发错误 所以 我在模板中使用了
  • 红宝石:能被4整除

    这工作正常 但我想让它更漂亮 并容纳所有能被 4 整除的值 if i 4 i 8 i 12 i 16 i 20 i 24 i 28 i 32 end 有什么聪明 简短的方法可以做到这一点吗 尝试这个 if i 4 0 这被称为 模运算符 h
  • 对于 C++ 插件系统来说什么是安全的?

    C 中的插件系统很困难 因为 ABI 没有正确定义 并且每个编译器 或其版本 都遵循自己的规则 然而 Windows 上的 COM 表明创建一个最小的插件系统是可能的 该系统允许具有不同编译器的程序员使用简单的接口为主机应用程序创建插件 让
  • 使用声明的可变基类无法在 MSVC 中编译

    我正在尝试实现一个可变访问者类 template