概述
在模板函数和普通函数重载时,C++编译器对函数的调用规则如下:
- 当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。
- 如果函数模板能产生更好的匹配,则使用函数模板。
- 函数模板不允许自动类型转化,普通函数能够进行制动类型转换。
规则一使用举例:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
int a = 1;
int b = 2;
cout << Max(a, b) << endl; //当函数模板和普通函数都符合调用时,优先选择普通函数
cout << Max<>(a, b) << endl; //若显示使用函数模板,则使用<> 类型列表
}
运行结果:
第一次调用时,函数模板和普通函数都符合调用条件,优先选普通函数。
第二次调用时,在Max后面加上了<>,则强制使用函数模板,所以会调用函数模板
规则二使用举例:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
cout << Max(3.0, 4.0) << endl; //如果 函数模板产生更好的匹配 使用函数模板
cout << Max(5.0, 6.0, 7.0) << endl; //重载
}
运行结果:
float转为int时会有精度的损失,所以普通函数不能匹配,这个时候只能选择函数模板。
规则三使用举例:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
cout << Max('a', 100) << endl; //调用普通函数 可以隐式类型转换
}
运行结果:
‘a’可以隐式转化为ASCII对应的int数值,所以会优先使用普通函数。
最后
以上就是妩媚鞋垫为你收集整理的模板函数和普通函数重载时的调用规则规则一使用举例:规则二使用举例:规则三使用举例:的全部内容,希望文章能够帮你解决模板函数和普通函数重载时的调用规则规则一使用举例:规则二使用举例:规则三使用举例:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复