调用重载'max(char&,char&)'是不明确的

时间:2011-09-02 05:14:21

标签: c++ templates overloading

#include <iostream>
using namespace std;

int max (int a, int b) 
{ 
   return a<b?b:a; 
} 

template <typename T> T max (T a, T b) 
{ 
   return a<b?b:a; 
} 

template <typename T> T max (T a, T b, T c) 
{ 
   return max (max(a,b), c); 
} 

int main() 
{ 
   // The call with two chars work, flawlessly.
   :: max ('c', 'b');

   // This call with three chars produce the error listed below:
   :: max ('c', 'b', 'a');
   return 0;
}  

错误:

error: call of overloaded ‘max(char&, char&)’ is ambiguous

这个max ('c', 'b', 'a')不应该用三个参数调用重载函数吗?

2 个答案:

答案 0 :(得分:8)

事情是,max中已有std,而您正在说using namespace std;

template <class T> const T& max ( const T& a, const T& b );

所以你的max ('c', 'b', 'a')被称为罚款;问题出在其中。

template <typename T> T max (T a, T b, T c) 
{ 
   return max (max(a,b), c); /* Doesn't know which max to pick. */
}

我不知道为什么max可用,因为你没有包含algorithm,但显然它是。

修改

如果您想将using保留在最顶层:

template <typename T> T max (T a, T b, T c) 
{ 
   return ::max(::max(a, b), c);
} 

答案 1 :(得分:3)

没有暧昧的电话。 http://ideone.com/SJ5Jc(注意第二行被评论)

问题是:using namespace stdhttp://ideone.com/T8tsv

它引起了问题,因为它将所有符号带入当前命名空间,并且似乎iostream直接或间接地包含定义std::max的标头。因此,当您在代码中编写::max时,编译器无法决定选择哪个max:您编写的那个或标准库定义的那个。

从您的代码中移除 using namespace std;