将 std::enable_if 与匿名类型参数一起使用

2023-11-22

我尝试使用std::enable_if使用未使用和未命名的类型参数,以免扭曲return类型。但是,以下代码无法编译。

#include <iostream>

template <typename T, typename = std::enable_if_t<!std::is_integral<T>::value>>
T foo() { std::cout << "non-integral" << std::endl; return T(); }

template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
T foo() { std::cout << "integral" << std::endl; return T(); }

int main() {
  foo<float>();
  foo<int>();
}

编译器说:

7:3: error: redefinition of 'template<class T, class> T foo()'
4:3: note: 'template<class T, class> T foo()' previously declared here
 In function 'int main()':
11:12: error: no matching function for call to 'foo()'
11:12: note: candidate is:
4:3: note: template<class T, class> T foo()
4:3: note: template argument deduction/substitution failed:

这里有什么问题?我必须如何更改代码才能编译? 《Discovering Modern C++》教科书明确鼓励使用std::enable_if带有匿名类型参数。

编辑:我知道如果我放的话它会起作用std::enable_if进入返回类型。然而,我的目的是获得更多细节,为什么如果我将它与匿名类型参数一起使用,它不起作用。正如我所说,我的教科书鼓励使用匿名类型参数的变体,所以我想知道为什么我的代码无法编译。


然而,我的目的是获得更多细节,为什么如果我将它与匿名类型参数一起使用,它不起作用。

默认值不参与重载解析,因此您实际上是在重新定义相同的函数。

让我们简化您的示例:

template<typename = int>
void f() {}

template<typename = void>
void f() {}

int main() {
    f<>();
}

上面的代码无法编译,因为它不知道什么版本f你想调用。

在你的情况下,如果我调用foo as foo<void, void>,我也有几乎同样的问题。
编译器无法猜测我的意图,并且第二个参数具有默认值这一事实并不意味着您不能传递不同的类型。

因此,代码格式不正确,编译器会正确地给出错误。


附带说明一下,您仍然可以在不使用std::enable_if_t在返回类型中。
举个例子:

#include <type_traits>
#include <iostream>

template <typename T, std::enable_if_t<!std::is_integral<T>::value>* = nullptr>
T foo() { std::cout << "non-integral" << std::endl; return T(); }

template <typename T, std::enable_if_t<std::is_integral<T>::value>* = nullptr>
T foo() { std::cout << "integral" << std::endl; return T(); }

int main() {
    foo<float>();
    foo<int>();
}

当我试图弄清楚OP的(错误)假设是什么并解释为什么会出现这种情况时,@T.C.正确地指出了对该答案的评论中实际原因的关注。
值得引用他的评论来为答案添加更多细节:

这不是重载解析;而是重载解析。这是声明匹配。首先,没有两个重载会产生任何歧义。这是两个重新定义错误:函数模板和默认模板参数。

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

将 std::enable_if 与匿名类型参数一起使用 的相关文章

  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 用于 C/C++ 的独立跨平台 (Windows/Linux) 文件压缩?

    我正在寻找一个 最好是小的 C 或 C 开源库 我可以将其包含在我的 MIT 许可项目中 托管在 google 代码上 我是一名业余爱好 C C 程序员 所以我并不那么先进 但我只知道为名为 SA MP 的应用程序 适用于 Windows
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • Jquery 的 Ajax 自动完成:如何发送动态参数

    我在用Ajax Autocomplete for Jquery http www devbridge com projects autocomplete jquery 在我的一个应用程序中 搜索表单看起来像这样
  • 如何查看 AngularDart 集合的元素?

    我有一个模型 class WordList List
  • AH=2 的 BIOS INT 13H 每次只能读取 72 个扇区。为什么?

    我正在使用 Bochs 2 4 5 编写引导扇区代码 我使用 INT 13H 从软盘读取扇区 但我发现如果读取的扇区数 gt 72 INT13就会失败 返回码为AH 1 下面是代码 这是INT13 返回码为AH 1 为什么INT 13H不能
  • NoMethodError:推送到 Heroku 时,nil:NilClass 未定义方法“[]”

    这里是 Rails 菜鸟 我在推送到 Heroku 时遇到了问题 NoMethodError nil NilClass 的未定义方法 我什至不确定应该从哪里开始解决这个问题 remote gt Preparing app for Rails
  • Twitter Bootstrap 在表格单元格上使用collapse.js [即将完成]

    我正在开发一个列出交易 贷方和借方 的帐户页面 我希望用户能够单击表行 它会展开以显示更多信息 我正在使用 Twitter bootstrap 并查看了文档 这是我得到的结果 table class table table striped
  • 使用 cURL 通过 Powershell 2.0 发出 POST 请求

    Scenario 除此之外 Powershell 2 0 没有有用的 cmdlet Invoke RestMethod 我无法升级到版本 3 而且我发现的大多数示例都使用版本 3 我已经发现本文 然而 对于我的简单场景来说 这似乎太复杂了
  • 设置以编程方式添加的视图的样式

    在我的代码中 我以编程方式将单选按钮 复选框等输入元素添加到我的布局中 问题是 当您通过 xml 添加 radioButton 时 这些元素的样式不是您将获得的默认样式 它看起来真的很白 在白色应用程序背景上几乎是透明的 有点像透明的 另外
  • Paint() 和 PaintComponent() 之间的区别?

    我已经尝试过这方面的教程 但我仍然不太明白 基本上我的问题是哪种方法更好 为什么 我应该使用paint or paintComponent 请尽量让答案简单一些 谢谢 引用自文档paint method 该方法实际上将绘画工作委托给三个受保
  • 可以从 Google 地图 API 中提取行程预计到达时间吗?

    是否可以从两个地址点之间的谷歌地图 API 获取行程预计到达时间 以分钟为单位 和交通数据 有谁知道ETA值是否反映了交通状况 谷歌有一个距离矩阵API返回两个 或多个 点之间的距离和行进时间 可以指定为 lat lng 或地址 我不认为它
  • Spring Boot Tomcat 配置,从容器迁移到嵌入式

    我正在将用于在 Tomcat 容器中运行的 Spring Boot 应用程序迁移到运行嵌入式 Tomcat 的 Spring Boot 应用程序 我的旧 Tomcat 配置在 server xml 中有以下配置
  • 生产中的 CouchDB

    我一直在一些原型应用程序上使用 CouchDB 它非常出色 非常易于使用并且速度非常快 我想知道是否有人在生产中使用过它 并对它的可靠性 操作管理的性能适用性等有什么看法 我正在考虑使用它来支持服务层并利用其复制功能 任何评论 经验都将受到
  • 将焦点设置在 元素上

    我正在使用 Angular 5 开发前端应用程序 我需要隐藏一个搜索框 但单击按钮后 应该显示搜索框并聚焦 我已经尝试了在 StackOverflow 上找到的一些带有指令的方法 但无法成功 这是示例代码 Component selecto
  • Bootstrap 轮播 - YouTube 视频播放时暂停

    我的 Bootstrap 轮播中有一些嵌入的 YouTube 视频 默认情况下 轮播会自动前进 但我想在视频播放时暂停 有没有什么技巧可以检测视频何时播放 如果可能的话 我希望不使用 YouTube API 来完成此操作 每个轮播都有任意数
  • 如何从字符串中删除所有字符

    如何使用 JavaScript 正则表达式从字符串中删除所有非字母字符 您可以使用replace method Hey The 123 sure is fun replace A Za z g gt gt gt HeyThesureisfu
  • 使用 django-axes 登录 Django

    我用 django 创建了一个网站 用户应该能够登录 登录视图如下所示 from django contrib auth import authenticate login from django contrib auth models i
  • 如何让JFrame透明?

    如何让JFrame透明 我想让我的 JFrame 透明 当我的 JFrame 位于背景之上时 用户应该看到背景 我找到了另一个解决方案 将框架的背景颜色设置为 Set the frame background color to a tran
  • scikit-learn 中带有 BaseEstimator 的 GradientBoostingClassifier?

    我尝试在 scikit learn 中使用 GradientBoostingClassifier 它使用默认参数可以正常工作 但是 当我尝试用不同的分类器替换 BaseEstimator 时 它不起作用并给出以下错误 return y np
  • Slick/Scala:什么是 Rep[Bind] 以及如何将其转换为值?

    我正在尝试找出 Slick Scala 函数关系模型 我已经开始在 Slick 3 0 0 中构建原型 但是当然 大多数文档要么已过时 要么不完整 我已经成功地达到了可以创建模式并从数据库返回对象的程度 问题是 我返回的是 Rep Bind
  • (如何)使用 LLVM 机器代码分析器预测代码片段的运行时间?

    我使用 llvm mca 来计算总周期一段代码 认为他们会预测它的运行时间 然而 动态测量运行时间几乎没有相关性 所以 为什么 llvm mca 计算的总周期不能准确预测运行时间 我可以使用 llvm mca 以更好的方式预测运行时间吗 D
  • 将 std::enable_if 与匿名类型参数一起使用

    我尝试使用std enable if使用未使用和未命名的类型参数 以免扭曲return类型 但是 以下代码无法编译 include