模板功能 - 模板是否覆盖正常功能

时间:2017-06-29 06:29:11

标签: c++ c++11 templates

我正在使用c ++模板测试以下代码。我使用int和float以及函数模板编写了一个square函数。

#include <iostream>
using namespace std;

int square (int a){
cout << "int function" << endl;
return a*a;
};

float square (float a){
cout << "float function" << endl;
return a*a;
};

template <typename T>
T square (T x){
cout << "template function" << endl;
return x*x;
}

int main(){
cout << square<int>(5) << endl;
cout << square<float>(5.5) << endl;
cout << square(5) << endl;
cout << square(5.5) << endl;
return 0;
}

输出

template function
25
template function
30.25
int function
25
template function
30.25

虽然我期待

template function
25
template function
30.25
template function
25
template function
30.25

有人可以解释一下这个区别吗?

2 个答案:

答案 0 :(得分:5)

它不会覆盖任何东西,这是一个更好的匹配。这是因为parent-component5.5类型的常量,而不是double类型的常量。

你没有任何双重超载,所以模板被实例化。那是因为模板不需要从double到float的转换序列,而不是你的重载。

如果您使用float常量,请执行以下操作:

float

会打印

cout << square(5.5f) << endl;

答案 1 :(得分:4)

模板没有&#34;覆盖&#34;常规功能。恰恰相反,常规功能通常是&#34; win&#34;重载解析过程,如果它们匹配调用中指定的参数类型。所以,它实际上是另一种方式:所有其他条件相同,常规功能&#34;覆盖&#34;模板功能。

在您的情况下,前两个调用转到模板,因为您在调用中使用<>明确请求了模板。您明确禁止编译器使用常规函数。

第三个调用转到常规函数,因为它是完全匹配的,因此它会赢得&#34;如上所述。

第四次调用转到模板版本,因为现有常规函数不是完全匹配(float参数与double参数),而模板可用于生成完全匹配。