CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

template question 3

楼主tommy851027(努力,努力!)2006-03-03 18:52:31 在 C/C++ / C++ 语言 提问

函数模板和普通函数的调用  
   
   
  #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

相关问题

  • template question!!
  • template question 1
  • template question 2
  • template
  • about template
  • template与workspace
  • template function问题
  • template partial specialization
  • 奇怪的template!
  • non_template collection classes?

关键词

  • 函数
  • template
  • 转换
  • max
  • double
  • cout
  • using namespace std
  • test
  • type

得分解答快速导航

  • 帖主:tommy851027
  • fangrk
  • fangrk

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo