#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')
不应该用三个参数调用重载函数吗?
答案 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 std
:http://ideone.com/T8tsv
它引起了问题,因为它将所有符号带入当前命名空间,并且似乎iostream
直接或间接地包含定义std::max
的标头。因此,当您在代码中编写::max
时,编译器无法决定选择哪个max
:您编写的那个或标准库定义的那个。
从您的代码中移除 using namespace std;
。