为什么模板函数仅基于返回类型在 C++ 上工作?

2023-11-21

据我所知,重载函数必须包含不同的参数(类型或计数)。所以我认为模板函数不应该仅仅基于返回类型。但是下面的代码适用于GCC 6.3.0.

#include <iostream>
using namespace std;

template<typename T>
T add(double a, double b)
{
    return static_cast<T>(a + b); 
}

int main()
{
    cout << add<int>(1.1, 1) << endl;
    cout << add<double>(1.1, 1) << endl;
    return 0;
}

构建并运行:

g++ -g -o test test.cpp
./test
2
2.1

C++ 标准是否澄清了这一点?谢谢!


不能仅根据返回类型进行重载的原因是,与参数类型不同,返回类型不是函数签名的一部分。不要相信我的话,C++ 标准也这么说:

[定义签名]

⟨function⟩ 名称、参数类型列表和封闭的命名空间(如果有)

[ 注意:签名用作名称修改和 链接。 ——《尾注》

但对于函数模板专业化,无论是隐式还是显式生成,签名都包含参数:

[defns.signature.spec]

⟨函数模板特化⟩ 模板的签名 它是一个专业化及其模板参数(无论是明确的 指定或推论)

So for add<int>, the int成为签名的一部分。不是因为它是返回类型,而是因为它是模板参数。同样适用于add<double>。只要签名不同,它们就可以被识别为不同的函数,因此可能会在同一个名称上重载。

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

为什么模板函数仅基于返回类型在 C++ 上工作? 的相关文章

  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 为什么 ASP.Net MVC Range 属性采用类型?

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

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 如何为子控制台应用程序使用单独的控制台窗口?

    Windows 10 C NET Core 3 1 我想要多个控制台窗口用于输出 例如 在一个显示器上 我想放置一个控制台窗口 它将仅显示错误输出 在另一个显示器上 我想放置一组其他控制台窗口 它将显示各种报告 所有这些控制台窗口都是只读的
  • IIS 中有 ASP.NET 网站管理工具吗?

    我正在使用 asp net 网站管理工具来管理项目中的不同角色 当前是客户和管理员 在vs 2008的开发过程中 管理角色非常容易 项目 gt Asp Net 配置 部署系统 IIS 时如何管理我的角色和用户 是否可以在 IIS 上运行 a
  • 为什么我们不在函数中通过引用传递 POD?

    我总是被告知我们不应该通过引用传递 POD 但最近我发现引用实际上根本不占用内存 那么为什么我们选择这样写 void DoSomething int iNumber 代替 void DoSomething const int riNumbe
  • 表单头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++

    我之前关于同一项目的问题 one https stackoverflow com questions 15758851 unresolved external sybol in referenced library visual c and
  • SQL Server 存储过程更新不适用于 ASP.Net C# GridView RowUpdating

    我遇到了问题 但没有抛出任何错误 发生的情况是 我有一个存储过程正在驱动我的更新 但我无法更新 gridview 我击中了Update链接按钮 但它实际上并没有更新记录 这是我的存储过程 ALTER PROCEDURE dbo CompDe
  • 如何将值插入DataGridView单元格?

    I have DataGridView 持有任何DataBase 我想将任何值插入到任何单元格中 并且该值将保存在数据库上 如何做到这一点 在 C 中 提前致谢 您可以按如下方式访问任何 DGV 单元 dataGridView1 Rows
  • 如何使用 AutofacContrib.NSubstitute 监视被测类

    我正在使用 NSpec 框架 AutofacContrib NSubstitute v3 3 2 0 NSubstitute v1 7 0 0 目前最新的是 1 8 2 的类库项目中运行单元测试 The 被测类实例是用AutoSubstit
  • 尝试更新 datagridview 时界面冻结

    我正在使用下面的代码复制文件并将状态列设置为datagridview通知用户连接已建立 但是当我按下按钮执行时 方法界面冻结 我已经搜索了很多我知道使用task run 不可能 因为它不包含在 not 4这是一个新功能 net 4 5我也知
  • unique_ptr编译错误

    如果我告诉你我无法编译它 我想这会很尴尬 请你帮我一下好吗 include
  • 使用 MEF 从 shell 加载棱镜模块视图

    我有一个 shell 项目 它将引导程序中的模块加载到 shell 主视图中的选项卡控件中 我刚刚在选项卡项上实现了一个关闭按钮 现在提出了如何从 shell 重新加载模块视图的问题 尝试使用 moduleManager LoadModul
  • 代码分析警告 CA2213 - 在 IDisposable 支持字段上调用 ​​Dispose()

    想要发布这个 尽管我在写问题时就弄清楚了 下面将发布答案 使用 VS Code Analysis 收到以下警告 警告 CA2213 DBConn 包含 IDisposable 类型的字段 DBConn k BackingField SqlC
  • 在哪里可以找到 GLIBCXX_3.4.29?

    我将 GCC 编译器从 GIT 存储库更新到版本 11 现在我的测试代码 GoogleTest GoogleMock 抱怨找不到 GLIBCXX 3 4 29 这不是重复的 请重新打开答案发布于 更详细地了解 gcc 版本和 GLIBC G

随机推荐

  • 函数调用内的 Malloc 似乎在返回时被释放?

    我想我已经把它归结为最基本的情况 int main int argc char argv int arr foo arr printf car 3 d n arr 3 free arr return 1 void foo int arr a
  • 有没有更好的方法将格式化输出传递给 OutputDebugString?

    通常 当我需要在 Windows 中进行调试输出时 我使用以下 C 代码段 ifdef DEBUG define DBGPRINT kwszDebugFormatString wprintf s L s d FUNCTIONW LINE w
  • 从 appengine 应用程序将文件上传到 Google 云存储

    我确信这个问题的答案很简单 但对我来说 这被证明是非常令人沮丧的 因为我无法将我找到的任何解决方案放入实际代码中供我自己使用 我正在应用程序引擎上构建一个应用程序 让用户上传文件 然后由应用程序执行操作 文件的大小通常约为几 Mb 在某些情
  • 仅在调试模式下使用 gradle 的一组类和资源

    我只想在调试模式构建类型 Android studio gradle 中添加特定功能 将一组类和资源限制为调试构建类型 gradle 我当前的解决方案是使用debug目录来存储额外的类和资源 并在代码中当BuildType DEBUG属性设
  • Python struct.pack() 行为

    data 5 Result1 struct pack
  • 修改 Chart.js 2 中散点图的 X 轴标签

    在 Chart js 2 中 我生成一个散点图 其中 x 坐标是纪元时间戳 y 坐标是整数 我想知道是否有一种方法可以格式化图表的 x 轴标签 以便日期以人类可读的格式显示 更新 目前我正在根据 Unix 时间戳 以毫秒为单位 构建图表 该
  • 获取产品变体属性值术语 ID 和名称

    在 WooCommerce 中 我正在使用 product gt get variation attributes 获取产品的变体属性 此函数返回一个包含名称但不包含 ID 的数组 像这样 pa color shirt gt Array 0
  • 高效计算向量组合

    出于好奇 我正在研究一个研究问题 但我不知道如何对我想到的逻辑进行编程 让我向你解释一下 我有四个向量 例如 v1 1 1 1 1 v2 2 2 2 2 v3 3 3 3 3 v4 4 4 4 4 现在我想做的是将它们组合起来 即 v12
  • 如何在不同的 OpenCV 版本中使用 `cv2.findContours`?

    我正在尝试将 OpenCV 与 Python 结合使用 以便检测来自 Raspberry Pi 相机的实时视频源中的方块 但是 那cv2 GaussianBlur and cv2 Canny下面代码中的函数导致以下错误 类型错误 numpy
  • 我可以让 KnownNat n 来暗示 KnownNat (n * 3) 等吗?

    我正在处理这种形状的数据类型 使用V from linear type Foo n V n 3 Double gt Double 将其固定在n非常重要 因为我希望能够确保在编译时传递正确数量的元素 这是我的程序的一部分 已经运行良好 独立于
  • 如何使用 superagent 发送文件

    所以大约一个月前我问一个问题关于超级代理和发送文件 但根本没有得到任何回应 我仍然想知道如何做到这一点 因为我喜欢使用超级代理 我可以使用普通的 ajax 发送文件 var fd new FormData fd append file th
  • 如何在 AngularJS e2e 测试中测试拖放功能

    我正在尝试测试我的应用程序 我需要将小部件从一个位置移动到另一个位置 换句话说 我需要在端到端测试中测试拖放功能 我将如何测试这个 我也有同样的问题 对我来说 解决方案是遵循此处 Selenium 问题中的建议 https code goo
  • 加速 R 中 sapply 调用中使用的函数

    我有两个向量e and g 我想知道中的每个元素e中元素的百分比g那些更小 在 R 中实现这一点的一种方法是 set seed 21 e lt rnorm 1e4 g lt rnorm 1e4 mf lt function p v 100
  • p4命令相当于什么 svn status [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Perforce 树中查找未跟踪的文件 svn状态的模拟 我想知道什么 p4 命令可以显示哪些文件已更改 哪些文件未签入等 如果您正确使用 perforce p4 open 就是您要查找的内容
  • 名称的正则表达式

    刚刚开始探索正则表达式的 奇迹 作为一个从反复试验中学习的人 我真的很挣扎 因为我的试验引发了不成比例的错误 我的实验是在 PHP 中使用 ereg 进行的 反正 我分别处理名字和姓氏 但现在使用相同的正则表达式 到目前为止我有 A Z a
  • 升级 @types/angular 后出现“错误 TS2694:命名空间 'Angular' 没有导出成员 'xxx'”

    将 Angular 和 types Angular 版本升级到版本 1 6 x 后 我有很多 TS2694 错误 error TS2694 Namespace angular has no exported member material
  • 无法实例化活动 ComponentInfo 无法实例化类

    提前感谢所有关注这个问题的人 特别是那些尝试回答的人 这个网站对我帮助很大 我目前在 Android 4 2 2 应用程序中遇到以下错误 下面是日志猫 09 09 01 14 27 008 D dalvikvm 9008 newInstan
  • Xcode 编辑器中不再有快速帮助

    快速帮助在我的 Xcode 5 OS X 10 8 5 上为 5 0 2 中消失了 而不是应该弹出的小弹出窗口Opt Click快捷方式所显示的只是箭头图像 自从Xcode 5升级之后就这样了 有什么想法如何修复它 FWIW 事实上 文档集
  • Atom:使用 Rome 的 RSS 链接

    It is 受到推崇的添加到 RSS 2 0 我想知道是否有任何罗马模块可以添加此标签 就像他们为内容 媒体开发的那样 etc 博客文章将 Atom 链接添加到由 ROME 生成的 RSS 提要准确回答了这个问题 没有对 RSS 提要中的
  • 为什么模板函数仅基于返回类型在 C++ 上工作?

    据我所知 重载函数必须包含不同的参数 类型或计数 所以我认为模板函数不应该仅仅基于返回类型 但是下面的代码适用于GCC 6 3 0 include