gcc 不接受具有通过嵌套模板化 using 子句定义的非类型模板参数的成员的外线定义

2024-01-29

标题看起来很复杂,但我们的测试用例实际上是真实案例的最小示例。

我们有一些代码想要根据模板参数选择方法的实现。我们在清理过程中定义了条件enable_if_t使用 using 子句,并且下一步想要将定义排除在外,这产生了以下代码:

#include <type_traits>
#include <iostream>
#include <string>

template <typename T>
struct A {
    template <typename U>
    using is_int_or_float = std::enable_if_t< std::is_same<U, int>::value || std::is_same<U, float>::value >;

    template<typename U = T, is_int_or_float<U>* = nullptr >
    void f();
    template<typename U = T, typename std::enable_if_t< std::is_same<U,std::string>::value >* = nullptr >
    void f();
};

template <typename T>
template <typename U, typename A<T>::template is_int_or_float<U>* >
void  A<T>::f(){
    std::cout << "f for int or float\n";
}

template <typename T>
template<typename U, typename std::enable_if_t< std::is_same<U,std::string>::value >*>
void A<T>::f() {
    std::cout << "f for string\n";
}

int main () {
    A<int> a_int;
    A<std::string> a_string;
    A<float> a_float;
    a_int.f();
    a_string.f();
    a_float.f();
    a_float.f<std::string>();
    return 0;
}

Gcc 不接受它,而 clang 接受:https://godbolt.org/g/Gfm1tw https://godbolt.org/g/Gfm1tw

gcc(和icc)抱怨没有有效的原型来定义方法is_int_or_float.

我不确定 clang 是否过于混乱,或者 gcc 应该能够超越依赖类型。

如果我们切换,代码就可以工作typename A<T>::template is_int_or_float<U>对于它的定义:

template <typename T>
template <typename U, std::enable_if_t< std::is_same<U, int>::value || std::is_same<U, float>::value >* >
void  A<T>::f(){
    std::cout << "f for int or float\n";
}

是否使用using改变一些关于类型匹配的规则,或者 gcc 应该能够使用它吗?

EDIT:感谢来自的输入@VTT https://stackoverflow.com/users/7860670/vtt我们发现,差异在于typename外行声明中的关键字typename A<T>::template is_int_or_float<U>*。删除它会使 gcc 编译并 clang 拒绝代码。

因此,问题可以重新表述和简化:在这种情况下, typename 是必需的还是允许的?


None

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

gcc 不接受具有通过嵌套模板化 using 子句定义的非类型模板参数的成员的外线定义 的相关文章

随机推荐

  • Java 中 CRTP 的替代品 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 The CRTP https en wikipedia org wiki Curiously recurring template patter
  • 在 React Native 中存储来自 json api 的大数据集合的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要制作一个具有离线功能的应用程序 可以从 json api 获取大约 10 000 个对象 估计 10mb 数据 并将它们存储在本地 以便在
  • Eloquent:带时间戳的默认值无效

    这是我的迁移架构 public function up Schema create objects function Blueprint table table gt increments id table gt timestamp tim
  • UICollectionView补充视图如何正确插入或删除

    简短的问题 有没有办法添加和删除补充视图 例如单元格和部分performBatchUpdates 块类似于insertItemsAtIndexPaths deleteItemsAtIndexPaths 甚至reloadItemsAtInde
  • 为什么 Oracle 不告诉你哪个表或视图不存在?

    如果您使用过 Oracle 您可能会收到有用的消息 ORA 00942 表或视图不存在 该消息不包含丢失对象的名称是否存在合法的技术原因 关于这是出于安全原因的争论听起来像是美国运输安全管理局 TSA 精心策划的 如果我是攻击者 我就会知道
  • 如何使用 d.items() 更改 for 循环中的所有字典键?

    我需要一些帮助来理解为什么这段代码没有按预期工作 如果想更改字典的键但保留值 他 她可以使用 d new key d pop old key 我想修改所有键 并将值保留在适当的位置 但下面的代码会跳过某些行 col2 保持不变 是因为字典是
  • 为什么管道的容量有限?

    我读到管道需要有有限的容量 但我不明白为什么 如果进程无限制地写入管道会发生什么 这是由于缓冲 管道并不 神奇 管道并不能确保所有进程都按步调一致地处理每个单独的字节或字符 相反 管道缓冲进程间输出 然后传递缓冲区 这个缓冲区大小限制就是您
  • 带滑动菜单的 Sherlock 操作栏

    我正在创建一个扩展 SherlockMapActivity 的视图和活动 并使用 SlidingMenu 库使我的主视图像 Google 一样滚动 我已经通过 XML 添加了 SlidingMenu 并且我的视图滚动完美地显示了隐藏菜单 但
  • 如何停止matlabplot3缩放

    我想使用绘制摆 改变位置 plot3功能 不幸的是 当我的点在循环中改变位置并再次绘制时 3d 图的比例也在变化 因此 x 轴取决于位置变化 取决于点的位置 它可以从 1 到 1 5 或从 1 到 3 并且 y 也会改变 只有 z 表示相同
  • 如何检测 Ag-grid 中的细胞模糊(失焦)事件

    我需要检测网格单元何时在农业网格中失去焦点 我已经检查了文档中可用的 API 但没有找到任何类似于单元格模糊的内容 https www ag grid com javascript grid events https www ag grid
  • SBT 在所有子项目之后运行任务

    我想编写一个在所有子项目任务完成后运行的任务 例如 如果我这样做 sbt a b然后在所有子项目上完成任务 a 后 我想执行任务 b 我不想对每个项目都做 a b 那可能吗 事实上 我会直接修改build sbt 我不一定必须在命令行中指定
  • 如何在 Excel 2007 中执行两个二进制数的异或计算

    我想对两个二进制数执行异或计算 例如 在工作表 1 上 Range A1 10101010 Range A2 11100010 现在我需要对A1 A2结果进行异或运算得到A3 我尝试了不同的公式的两个执行异或计算 例如 A1 A2 BITX
  • 使用 python 在不同的 virtualenv 中运行子进程

    假设我在 2 个不同的虚拟环境中安装了 2 个不同版本的应用程序 myapp v1 0 和 myapp v2 0 现在我想对它们进行比较 比较是用 python 本身编写的 最好的方法是什么 假设我可以单独运行它们并写入一个输出文件 以便稍
  • Django 按月/按季度对 Date Field() 数据进行分组

    我有一个 django 模型 其中包含日期字段 属性 class Table date models DateField value models FloatField 我正在编写一个视图 按周 月 季度和年份对这些数据进行分组 我已经硬编
  • 接口隔离原则只是单一职责原则的替代品吗?

    接口隔离原则只是单一责任原则的替代品吗 我认为如果我的类满足 SRP 则无需提取多个接口 因此 ISP 看起来像是解决方案 以防我们因某种原因必须破坏 SRP 我对吗 不 以一个类为例 该类的职责是保存数据 例如硬盘 将类分为读部分和写部分
  • @JvmDefault 以及如何添加编译器选项

    我需要做一个default voidKotlin 接口中的方法 我遇到了一个问题 有一个提示说的用法 JvmDefault只允许与 Xjvm default option 我需要在哪里写这个Xjvm default Target Annot
  • 从Unity3D代码启动android服务

    在我的 Android Unity3D 应用程序中 我需要启动一个服务 该服务将在后台运行 我不知道我该怎么做 方法启动服务 必须在活动上调用 但我不知道如何将当前的统一活动从统一脚本传递到我的 android 插件 我还没有找到任何方法以
  • 如何在ggplot中为facet_grid标签包装文本

    我一直在寻找如何换行文本 似乎应该有一种方法可以使用 labeller label wrap gen 3 但我不断收到错误 边距错误 vars 边距 未使用的参数 边距 这是我的代码的一部分 simpson by protected sta
  • 如何使用扩展方法将附加数据与现有对象相关联?

    自 NET Framework 3 5 以来 开发人员已经能够添加可从任何对象类型的实例调用的扩展方法 然而 扩展属性尚未在 C 中实现 与扩展方法不同 扩展属性将涉及为各个对象存储一些额外的状态信息 然而 即使对于扩展方法 在某些编程场景
  • gcc 不接受具有通过嵌套模板化 using 子句定义的非类型模板参数的成员的外线定义

    标题看起来很复杂 但我们的测试用例实际上是真实案例的最小示例 我们有一些代码想要根据模板参数选择方法的实现 我们在清理过程中定义了条件enable if t使用 using 子句 并且下一步想要将定义排除在外 这产生了以下代码 includ