下面这段代码在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)引用的方式出现的,请问这是由于新标准导致的吗?还是其他原因,向高手求救
函数模板问题
答案:2 悬赏:50
解决时间 2021-03-17 07:30
- 提问者网友:心裂
- 2021-03-16 22:46
最佳答案
- 二级知识专家网友:努力只為明天
- 2021-03-16 23:01
呵呵,其实你的代码并没有什么错误,这个问题很并不是你所想象的那么复杂:
你所定义的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的支持有限,固并没有所错。
希望我的问答对你有所帮助!
你所定义的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的支持有限,固并没有所错。
希望我的问答对你有所帮助!
全部回答
- 1楼网友:闲懒诗人
- 2021-03-16 23:23
首先,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改个名字。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯