据我所知,重载函数必须包含不同的参数(类型或计数).所以我认为模板函数不应该只基于返回类型.但是以下代码可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
构建并运行:
g++ -g -o test test.cpp
./test
2
2.1
Run Code Online (Sandbox Code Playgroud)
剂量C++标准澄清了这一点?谢谢!
Sto*_*ica 12
不能仅基于返回类型重载的原因是返回类型不是函数签名的一部分,与参数类型不同.不要相信我的话,C++标准同样说:
⟨function⟩name,parameter-type-list和封闭命名空间(如果有的话)
[注意:签名用作名称修改和链接的基础. - 结束说明]
但对于函数模板特,被他们产生或明或暗地,签名包含参数(S):
⟨functiontemplatespecialization⟩模板的签名,它是一个特化及其模板参数(无论是明确指定还是推导)
因此add<int>,它int成为签名的一部分.不是因为它是返回类型,而是因为它是模板参数.同样的add<double>.只要签名不同,那些可以被识别为不同的功能,因此可能在同一名称上重载.