首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板函数-模板是否覆盖正常函数

模板函数-模板是否覆盖正常函数
EN

Stack Overflow用户
提问于 2017-06-29 14:29:11
回答 2查看 388关注 0票数 0

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

代码语言:javascript
复制
#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;
}

输出为

代码语言:javascript
复制
template function
25
template function
30.25
int function
25
template function
30.25

尽管我期待着

代码语言:javascript
复制
template function
25
template function
30.25
template function
25
template function
30.25

有人能解释一下其中的区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-29 14:42:51

模板不会“覆盖”常规函数。相反,如果常规函数与调用中指定的参数类型匹配,则它们通常会“赢得”重载解析过程。因此,这实际上是另一种方式:在所有其他条件相同的情况下,常规函数“覆盖”模板函数。

在您的示例中,前两个调用转到模板,因为您在调用中使用<>显式地请求了模板。您显式禁止编译器使用常规函数。

第三个调用转到常规函数,因为它是一个完全匹配的函数,因此它“获胜”,如上所述。

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

票数 4
EN

Stack Overflow用户

发布于 2017-06-29 14:34:55

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

您没有对doubles进行任何重载,因此模板被实例化。这是因为模板不需要从双精度到浮点数的转换序列,而不是重载。

如果使用float常量,如下所示:

代码语言:javascript
复制
cout << square(5.5f) << endl;

它将打印出来

代码语言:javascript
复制
float function
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44817829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档