我正在使用c++模板测试以下代码。我已经使用int和float和函数模板编写了一个正方形函数。
#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有人能解释一下其中的区别吗?
发布于 2017-06-29 14:42:51
模板不会“覆盖”常规函数。相反,如果常规函数与调用中指定的参数类型匹配,则它们通常会“赢得”重载解析过程。因此,这实际上是另一种方式:在所有其他条件相同的情况下,常规函数“覆盖”模板函数。
在您的示例中,前两个调用转到模板,因为您在调用中使用<>显式地请求了模板。您显式禁止编译器使用常规函数。
第三个调用转到常规函数,因为它是一个完全匹配的函数,因此它“获胜”,如上所述。
第四个调用转到模板版本,因为现有的常规函数不是精确匹配(float参数与double参数),而模板可用于生成精确匹配。
发布于 2017-06-29 14:34:55
它不会覆盖任何东西,它是一个更好的匹配。这是因为5.5是double类型的常量,而不是float类型的常量。
您没有对doubles进行任何重载,因此模板被实例化。这是因为模板不需要从双精度到浮点数的转换序列,而不是重载。
如果使用float常量,如下所示:
cout << square(5.5f) << endl;它将打印出来
float functionhttps://stackoverflow.com/questions/44817829
复制相似问题