函数模版重载的问题

showming 2009-08-06 04:58:12
我写了段代码,函数模版重载的问题。
在VC6.0和VC2005执行有不同的效果。


#include <iostream>
#include <string>
using std::cout;
using std::endl;

template <typename T> T Max(T a, T b)
{
if (a>=b)
{
return a;
}

return b;
}


char* Max(char* a, char* b)
{
if (NULL==a || NULL==b)
{
if (NULL!=a)
{
return a;
}
if (NULL!=b)
{
return b;
}
return NULL;
}

int cmp_str =strcmp(a, b);

if (cmp_str>=0)
{
return a;
}

return b;
}


int main(int argc, char* argv[])
{
cout<<Max("a","b")<<endl;
system("pause");
return 0;
}



函数char* Max(char* a, char* b)在VC2005下没有起作用, 仍然执行模版函数,
而在VC6.0 char* Max(char* a, char* b) 被执行,
改成const char* Max(const char* a, const char* b)就可以VC2005被执行。

请解释一下原理, 谢谢!
...全文
174 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
showming 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 acrazer 的回复:]
编译器对模板支持问题:

最佳匹配

[/Quote]

我想基本上是两个编译器对最佳匹配的认同不同,
呵呵,谢谢大家!
sszwbuaa 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taodm 的回复:]
珍惜生命,远离VC6
[/Quote]
up!
xingzhe2001 2009-08-06
  • 打赏
  • 举报
回复
VC2005到vc6的编译器微软修正了成千上万个bug, 如果你想知道哪些代码会导致在两个版本上有错误,那么你可以找下它的changelst。建议有条件的话还是用新的编译器。
xingzhe2001 2009-08-06
  • 打赏
  • 举报
回复
为什么要用VC6?
showming 2009-08-06
  • 打赏
  • 举报
回复
我不是想问Max("a","b")中T的类型是不是该转为const char[]
而是想知道为什么VC6和VC2005有不同的处理结果,
他们的根源在哪,以后好避免在两个版本上犯错误!
KWHOK 2009-08-06
  • 打赏
  • 举报
回复
编译器对模板支持问题:

vc6.0应该说自从推出之后,就发布过几个补丁,似乎就没更新过

Max("a", "b");
我觉得,vc6之所以进入函数char *Max(char *, char*)是因为,
这是最佳匹配,
而2005,则把"a"认为是const char*
故认为最佳匹配时template那个,

而当加上const char* Max(const char *...)时,
对2005来说,两个都可以,但是由于const char* Max()这个是显示声明,
也就是最佳选择了!

编译器总是选择最佳的给与匹配!




pengzhixi 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xingzhe2001 的回复:]
Max("a","b")中T的类型时const char[],而你的T的类型时char*,编译器觉得不一样
[/Quote]

这个说法应该是最合理的
showming 2009-08-06
  • 打赏
  • 举报
回复
恩,貌似VC6.0在模版上没VC2005支持的好,
关于这个问题,我就想知道为什么在对待const char*和char*上VC6和VC2005有这么大区别?
xingzhe2001 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yshuise 的回复:]
const char* Max <const char*>(const char* a, const char* b);
上面写完整点是下面这个:

template <>
const char* Max <const char*>(const char* a, const char* b){
return a;
}
[/Quote]

像他这样最好在重载的函数前加上template <>
w0911h 2009-08-06
  • 打赏
  • 举报
回复
据说VC6对模板支持不太好,VS2005加强了这方面
taodm 2009-08-06
  • 打赏
  • 举报
回复
珍惜生命,远离VC6
xingzhe2001 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 showming 的回复:]
那为什么在VC6.0下可以直接执行 char* Max(char* a, char* b)
不用const char*即可。
[/Quote]

难道是vc6的bug?
yshuise 2009-08-06
  • 打赏
  • 举报
回复
const char* Max<const char*>(const char* a, const char* b);
上面写完整点是下面这个:

template<>
const char* Max<const char*>(const char* a, const char* b){
return a;
}
v2002750 2009-08-06
  • 打赏
  • 举报
回复
关键是编译器认为"a"是个什么类型吧,等大牛解答。
xingzhe2001 2009-08-06
  • 打赏
  • 举报
回复
Max("a","b")中T的类型时const char[],而你的T的类型时char*,编译器觉得不一样
showming 2009-08-06
  • 打赏
  • 举报
回复
那为什么在VC6.0下可以直接执行 char* Max(char* a, char* b)
不用const char*即可。
yshuise 2009-08-06
  • 打赏
  • 举报
回复
考楼主一个问题:
template <typename T> T Max(T a, T b);
const char* Max<const char*>(const char* a, const char* b);
const char* Max(const char* a, const char* b);

匹配那个
yshuise 2009-08-06
  • 打赏
  • 举报
回复
Max("a","b");
"a","b"就是常量。所以匹配const char*

64,654

社区成员

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

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