据我所知,重载函数必须包含不同的参数(类型或计数)。所以我认为模板函数不应该仅仅基于返回类型。但是下面的代码适用于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(使用前将#替换为@)