#include <iostream>
using namespace std;
template <typename T>
T max(T x, T y)
{
return (x > y) ? x : y;
}
int main()
{
cout << max(3, 7) << std::endl;
cout << max(3.0, 7.0) << std::endl;
cout << max(3, 7.0) << std::endl;
return 0;
}
我在这里期待最大的实例
cout << max(3, 7) << std::endl; // max (int, int)
cout << max(3.0, 7.0) << std::endl; // max (double, double)
cout << max(3, 7.0) << std::endl; // max(int, double)
然后是什么问题?我为什么要
11 25 [Error] call of overloaded 'max(double, double)' is ambiguous
答案 0 :(得分:2)
如果你完全查看编译错误,你会明白为什么。这是gcc 5.2给我的:
main.cpp: In function 'int main()':
main.cpp:10:21: error: call of overloaded 'max(int, int)' is ambiguous
cout << max(3, 7) << std::endl;
^
main.cpp:4:3: note: candidate: T max(T, T) [with T = int]
T max(T x, T y)
^
In file included from /usr/local/include/c++/5.2.0/bits/char_traits.h:39:0,
from /usr/local/include/c++/5.2.0/ios:40,
from /usr/local/include/c++/5.2.0/ostream:38,
from /usr/local/include/c++/5.2.0/iostream:39,
from main.cpp:1:
/usr/local/include/c++/5.2.0/bits/stl_algobase.h:219:5: note: candidate: constexpr const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]
max(const _Tp& __a, const _Tp& __b)
^
基本上,有两个max
函数 - 您和std::max
,它们来自#include
的其他<iostream>
链。后者是通过查找找到的,因为你的
using namespace std;
实际上,我们有:
template <typename T> T max(T, T); // yours
template <typename T> T const& max(T const&, T const&); // std
两者都不比另一方好,因此含糊不清。这是avoid using namespace std
的一个很好的理由。或者在标准库函数方面不重新发明轮子的一个很好的理由 - 只需使用std::max
。或两者。
另一方面,这一个
max(3, 7.0)
无论模板扣除失败,都会失败。对于第一个参数,它会将T
推导为int
,而对于第二个参数,它会T
推导为double
- 但只能有一个T
!您必须显式调用max<int>(3, 7.0)
或max<double>(3, 7.0)
才能解决扣除失败问题,具体取决于您要转换的两个参数中的哪一个。
答案 1 :(得分:1)
该行
using namespace std;
肯定会让事情变得复杂。但是,即使删除该行,问题仍然存在。
来电max(3, 7.0)
可以解析为max<int>
或max<double>
。要解析为max<int>
,必须将double
转换为int
。要解析为max<double>
,必须将int
转换为double
。由于两者都需要转换,并且一个转换的优先级不能高于另一个,因此编译器无法解析使用哪个转换。
您必须明确要使用的max
版本。
max<int>(3, 7.0)
会将7.0
,double
转换为int
。
max<double>(3, 7.0)
会将3
,int
转换为double
。
答案 2 :(得分:0)
Max是一个库函数。只需将函数的max标识符更改为max1或不是函数定义的任何头文件的任何其他名称。 那应该可以解决您的问题。