template question 3
函数模板和普通函数的调用
#include<iostream>
using namespace std;
template <class type>
type max(type a,type b){
return a>b?a:b;
}
double max(double a,int b){
cout<<"be used"<<endl;
return a>b?a:b;
}
int main()
{
// double max(double,int); //注意这行.
int a=10,b=20;
cout<<"Max number :\t"<<max(a,b)<<endl;
return 0;
}
最佳匹配是函数模板,不是普通函数,但是当把程序中那个注释行变成语句的时候就调用的是普通函数了,请问为什么啊?
难道内置转换的优先级要高于模板函数的推演吗?
问题点数:20、回复次数:8Top
1 楼pongba(刘未鹏|http://blog.csdn.net/pongba)回复于 2006-03-03 19:17:51 得分 0
The reason is rather complicated, please refer to the relevant chapters of "C++ Primer" or "C++ Templates".Top
2 楼fangrk(加把油,伙计!)回复于 2006-03-03 19:56:44 得分 10
main()中没有声明的话:
max(a,b)的可选函数是type max(type a,type b)和double max(double a,int b)
其中模板函数是精确匹配,普通函数需要标准转型,模板函数优于普通函数
main()中有声明的话:
查找规则:先在main函数中查找max,仅找到了一个普通函数作为可选函数,因此就调用普通函数
下面的例子无法编译,因为只有一个可选函数,模板函数没有做为候选者
#include<iostream>
using namespace std;
template <class type>
void TEST(type a,type b){
cout<<"template";
}
void TEST(const char*,int b){
cout<<"normal"<<endl;
}
int main()
{
void TEST(const char*,int);
int a=10,b=20;
TEST(a,b);
return 0;
}
D:\Study\Test>cl /GX a.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
a.cpp
a.cpp(17) : error C2664: “TEST” : 不能将参数 1 从“int”转换为“const char *”
从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
D:\Study\Test>Top
3 楼cunsh(村少)回复于 2006-03-03 20:13:54 得分 0
cout<<"Max number :\t"<< ::max(a,b)<<endl;
改成 ::max
Top
4 楼tommy851027(努力,努力!)回复于 2006-03-03 21:35:02 得分 0
to fangrk(加把油,伙计!)
你的意思是说如果在main()中声明了和模板函数函数名一样的普通函数,则程序只在main()中查找候选函数,而不关模板函数了。如果main()中没有声明则调用模板函数。
请问我理解的对吗?Top
5 楼fangrk(加把油,伙计!)回复于 2006-03-03 22:35:15 得分 10
如果main()中没有声明,那么模板函数和普通函数都作为候选函数,也都是可行函数。而此例中,模板函数可以精确匹配,普通函数需要标准转换,因此模板函数优先。Top
6 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2006-03-03 22:54:19 得分 0
//using namespace std;
using std::cin;
using std::cout;
using std::endl ;
修改如上,发现是 20。
如 fangrk(加把油,伙计!) 所说,
模板函数可以精确匹配,普通函数需要标准转换,因此模板函数优先。
为什么修改了和不修改的结果不同呢?
因为 cout<<"Max number :\t"<<max(a,b)<<endl;
调用的是 std::max 函数,是库函数,而不是你自定义的函数了。
Top
7 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-04 16:51:52 得分 0
我觉得是局部隐藏外部
//double max(double,int); //注意这行
去掉//时
double max(double,int)
隐藏了模板Top
8 楼howyougen(夫孝,德之本也,教之所由生也)回复于 2006-03-04 16:54:58 得分 0
#include<iostream>
using namespace std;
template <class type>
type max(type a,type b){
return a>b?a:b;
}
template <class type>
type max(type a){
return a;
}
double max(double a,int b){
cout<<"be used"<<endl;
return a>b?a:b;
}
int main()
{
//double max(double,int); //如果去掉注释编译通不过
int a=10,b=20;
max(1);
return 0;
}Top




