调用重载'min(int&,int&)'是不明确的

时间:2011-05-04 18:09:46

标签: c++ templates

我在模板上遇到了一些问题。这个代码在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毫秒)

5 个答案:

答案 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;

就是这样。谢谢。