我在模板上遇到了一些问题。这个代码在vc6下传递但在g ++下失败了。 有人能告诉我原因吗?感谢。
#include<iostream>
using namespace std;
template<class T>
T min(T x, T y) {
return (x < y ? x : y);
}
int main() {
int i1 = 23, i2 = 15, i;
float f1 = 23.04, f2 = 43.2, f;
double d1 = 0.421342, d2 = 1.24342343, d;
i = min(i1, i2);
f = min(f1, f2);
d = min(d1, d2);
cout << "The smaller of " << i1 << " and " << i2 << " is " << i << endl;
cout << "The smaller of " << f1 << " and " << f2 << " is " << f << endl;
cout << "The smaller of " << d1 << " and " << d2 << " is " << d << endl;
}
“/ usr / bin / make”-f nbproject / Makefile-Debug.mk QMAKE = SUBPROJECTS = .build-conf “/ usr / bin / make”-f nbproject文件/ Makefile-Debug.mk dist / Debug / GNU-MacOSX / traincpp mkdir -p build / Debug / GNU-MacOSX rm -f build / Debug / GNU-MacOSX / newmain.o.d g ++ -c -g -MMD -MP -MF build / Debug / GNU-MacOSX / newmain.o.d -o 构建/调试/ GNU-的MacOSX / newmain.o newmain.cpp newmain.cpp:在函数中 'int main()':newmain.cpp:13:错误: 调用重载'min(int&amp;,int&amp;)' 是不明确的newmain.cpp:5:注意: 候选者是:T min(T,T)[T = INT] /usr/include/c++/4.2.1/bits/stl_algobase.h:182: 注意:const _Tp&amp; std :: min(const _Tp&amp;,const _Tp&amp;)[with _Tp = int] newmain.cpp:14:错误:调用重载'min(float&amp;,float&amp;)'是 模棱两可的newmain.cpp:5:注意: 候选者是:T min(T,T)[T = 浮动] /usr/include/c++/4.2.1/bits/stl_algobase.h:182: 注意:const _Tp&amp; std :: min(const _Tp&amp;,const _Tp&amp;)[with _Tp = float] newmain.cpp:15:错误:调用重载'min(double&amp ;,, double&amp;)'是不明确的newmain.cpp:5: 注意:候选人是:T min(T,T) [有T =双] /usr/include/c++/4.2.1/bits/stl_algobase.h:182: 注意:const _Tp&amp; std :: min(const _Tp&amp;,const _Tp&amp;)[with _Tp = double] make [2]: * [build / Debug / GNU-MacOSX / newmain.o] 错误1 make [1]: [.build-conf] 错误2使:* * [.build-impl]错误 2
生成失败(退出值2,总计时间:623毫秒)
答案 0 :(得分:13)
这是因为您导入了所有std
namespace,这是一个no-no。请注意,其他候选人是模板std::min
。删除using namespace std;
并导入选择符号:
using std::cout;
using std::endl;
或限定他们:
std::cout << "The smaller of " << i1 << " and " << i2 << " is " << i << std::endl;
答案 1 :(得分:1)
可能你已经有了g ++中min()的定义。
答案 2 :(得分:1)
您的iostream
包也似乎也引入了标准min
调用,编译器无法确定您是否需要标准调用(因为您的using namespace
)或者你自己的。只需删除您自己的min
并使用标准库的版本。
答案 3 :(得分:1)
而不是编写std :: cout,你可以使用命名空间std,并在另一个命名空间中创建你的函数min,比如abc ...所以现在当你调用你的函数min时,只需写abc :: min ..这应该解决你的问题。
答案 4 :(得分:-1)
iostream
中已存在 swap()功能。因此,它与您的 swap()函数冲突。您可能必须指定要使用的swap()或更改交换函数的名称,如 swap1(),swap2()等。您可以将任何字母更改为交换函数的UPPERCASE比如 交换() 这可以在不删除using namespace std;
的情况下解决问题
否则,只需删除using namespace std'
并输入
using std :: cout;
using std :: endl;
代替OR写代码 -
std :: cout << "After swapping - a = " << a << ", b = " << b << std :: endl;
就是这样。谢谢。