中易网

函数模板问题

答案:2  悬赏:50  
解决时间 2021-03-17 07:30
下面这段代码在Microsoft Visual C++ 6.0下能够成功编译,在Microsoft Visual Studio 2010下编译却显示有错,
代码为:
#include<iostream>
using namespace std;
template<typename T>
T min(T x,T y)
{
return (x>y)?y:x;
}
int main()
{
int n=2,c=3;
cout<<min(n,c)<<endl;
return 0;
}
错误提示为:
“ :error C2668: “min”: 对重载函数的调用不明确;
:可能是“T min<int>(T,T)”
with
[
T=int
]
d:\visual studio 2010\vc\include\xutility(2093): 或 “const _Ty &std::min<int>(const _Ty &,const _Ty &)”
with
[
_Ty=int
]
尝试匹配参数列表“(int, int)”时
生成失败。


在Microsoft Visual Studio 2010下,当我把代码中的模板定义改为:
T min(T &x,T &y)
{
return (x>y)?y:x;
}
后却能成功编译。请问这是为什么?
我的教科书上都是以 “T min(T x,T y) ”形式出现的,在VC6.0下都能够正确编译,但到2010或2008却提示出错。
我只是查阅了下《C++ Primer第四版中文版》上的相应章节,书上所举例子都是以(const)引用的方式出现的,请问这是由于新标准导致的吗?还是其他原因,向高手求救
最佳答案
呵呵,其实你的代码并没有什么错误,这个问题很并不是你所想象的那么复杂:
你所定义的min函数模板和xutility的min函数模板的名字是一样的,编译器认为你是在重载xutility中的min函数,而你那样重载明显是不行的!所以的话你只要改一下函数的名字即可。
#include <iostream>,这一行将iostream包含进来了,估计这个文件或者是它所包含的文件中一某一个头文件将xutility文件include进来了。。。
然后你又using namespace std;使用std命名空间,而xutility中的min函数模板正是定义在std名字空间之下,所以xutility中的min函数模板起作用了。
你将using namespace std;去掉也可以解决问题, 但cout换成std::cout,endl换成std::endl即可。
至于VC6对STL的支持有限,固并没有所错。
希望我的问答对你有所帮助!
全部回答
首先,c没有函数模版。c++才有。 其次,template 是函数声明的一部分,所以下面函数实现应该是: template void swap(t &a,t &b){ int temp; temp=a; a=b; b=temp; } 最后,#include ,在标准的c++函数中,std的域中已经有一个swap函数。 而且前面也using namespace了。函数声明重复。 两个办法: 1 swap(i,j);改为 ::swap(i,j); //全局化。 2 swap改个名字。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
算盘的故事100字
如果宪法没有被执行,谁该为此负责?
丢在出租车上东西可是找不到,司机要是交回去
哪个晓得卫生间隔断门的尺寸有什么规定?宽度
怎样从北京到谢菲尔德
许氏酸菜鱼我想知道这个在什么地方
长春理工大学继教建工学院学习什么专业的?毕
中国坐飞机到阿根廷要多少小时
哪个网站支持下载免费的学术著作
paint方法画图第一次显示不出来
英语翻译用于形容上等的葡萄酒,广告用语,比如
北京有缘网是骗子网站
想退个性了,为什么我发的没有人看
哪里有法语学习的语音软件?
绵阳15路收车时间
推荐资讯
优唱量贩式KTV地址有知道的么?有点事想过去
用美不胜收迫不及待东碰西撞造句
哈飞路宝发动机故障灯亮,停一会开不亮,开一
吉他音箱上的黑“护板”是干什么的???
梁上下排钢筋间距多少
机器灵砍菜刀恁那边哩紧俺挑,挑谁吧,挑,挑
从昌平区育知路地铁去顺义北小营坐几号地铁
我老公特胖不爱锻炼爱出虚汗请问吃什么可以补
这个电脑配置可以玩lol吗,至少要多少配置
(6)现在不少人在许多场合喜欢写繁体字,这是
湘乡快递公司有哪些?
狗能喝特伦苏吗?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?