函数模板重载(不容易哦)?

czcwzw 2012-11-09 01:43:20
template<class T>
void fun(const T& a,const T& b)
{
}
void fun(const char* a,const char*b)
{

}
void main()
{
char *p= "aaa";
char *q = "bbb";
fun(p,q);

}
先说下在vs2008下运行结果,是调用模板函数.
这个结果我无法理解.
我的想法是:

对于普通函数,实参跟形参需要进行如下转换
实参 形参
char* -> const char*
/////////////////////////////////////
对于模板函数,实参跟形参需要进行如下转换
实参 形参
char* -> char* const&
如果都要进行转换,那么普通函数应该要优先于模板函数才对.
但是为什么结果是调用模板函数呢?难道模板函数不需要类型转换吗???
...全文
228 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
czcwzw 2012-11-13
  • 打赏
  • 举报
回复
来人啊,顶.
czcwzw 2012-11-12
  • 打赏
  • 举报
回复
to 2楼的,你的说法不对.举个例子吧: void main() { char p[]= "aaa"; char q[] = "bbb"; fun(p,q); } 如果是这样,那么结果是调用普通函数哦! 所以你说的"也就是说,只要函数不完全匹配,编译器就去函数模板中找匹配的函数,而不会管转换多少次。" 是不对滴. to 5楼的,这个我知道,但是就是想弄清楚这个例子.
czcwzw 2012-11-12
  • 打赏
  • 举报
回复
期待明白人出现
redui 2012-11-09
  • 打赏
  • 举报
回复
没有人这样搞的,最多就是用特化模板,模板和实体混合不是给自己找罪受吗
oyljerry 2012-11-09
  • 打赏
  • 举报
回复
普通函数没有匹配上.
儿女情长 2012-11-09
  • 打赏
  • 举报
回复
也就是说,只要函数不完全匹配,编译器就去函数模板中找匹配的函数,而不会管转换多少次。
儿女情长 2012-11-09
  • 打赏
  • 举报
回复
问题不难哦。 重载函数和模板函数的调用规则是:普通的函数是优先于模板函数的; 如果有普通的函数完全符合调用(不需要参数转换),那么是不会考虑模板函数的! 注意是“不需要参数转换”!,如果把你的void fun(const char* a,const char*b) 函数参数中的const都去掉,重新编译调试会发现不再调用模板函数!
lgstudyvc 2012-11-09
  • 打赏
  • 举报
回复
用模板就要守模板的规矩

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧