我有以下代码。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
template <typename Type> inline Type max(Type t1, Type t2) {
return t1 > t2 ? t1 : t2;
}
template <typename Type> inline Type max(const std::vector<Type> &vec) {
return *std::max_element(vec.begin(),vec.end());
}
template <typename Type> inline Type max(const Type *parray, int size) {
return *std::max_element(parray,parray+size);
}
int main(int argc, char *argv[]) {
std::string sarray[] = {"we","were","her","pride","of","ten"};
std::vector<std::string> svec(sarray,sarray+6);
int iarray[] = {12,70,2,169,1,5,29};
std::vector<int> ivec(iarray,iarray+7);
float farray[] = {2.5,24.8,18.7,4.1,23.9};
std::vector<float> fvec(farray,farray+5);
int imax = max(max(ivec),max(iarray,7));
float fmax = max(max(fvec),max(farray,5));
std::string smax = max(max(svec),max(sarray,6));
std::cout << "imax should be 169 -- found: " << imax << '\n'
<< "fmax should be 24.8 -- found: " << fmax << '\n'
<< "smax should be were -- found: " << smax << '\n';
return 0;
}
我试图实现两个简单的模板函数来输出向量和数组的max元素。但是,当类型是字符串时,我收到以下错误。
error: call of overloaded 'max(std::string, std::string)' is ambiguous
为什么会发生这种情况,补救它的最佳方法是什么?
答案 0 :(得分:3)
问题是编译器通过ADL找到max
的多个匹配定义,并且不知道选择哪个。
尝试将呼叫更改为max
以使用其qualified-id:
std::string smax = ::max(max(svec),max(sarray,6));
答案 1 :(得分:3)
您的代码
std::string smax = max(max(svec),max(sarray,6));
转换为:
std::string smax = max(string ,string );
使用您的模板评估max(svec)
和max(sarray,6)
之后。现在问题出现了:
标准库已经带有模板化的max()函数。编译器无法判断您的版本是max()
还是std::max()
。
现在你会问为什么它适用于整数和浮点数。答案就是这一行,你特别提到std::string
。因此编译器感到困惑。
可以有解决方法。但是既然你需要最好的解决方案,我会说你的最大函数重命名为MAximum。
答案 2 :(得分:0)
为什么会这样?
编译器错误已经告诉您原因。它不知道要使用哪个版本的max
。
注意:候选人是:
main.cpp:6:38:注意:输入max(Type,Type)[with Type = std :: basic_string]
...
/usr/include/c++/4.7/bits/stl_algobase.h:210:5:注意:const _Tp&amp; std :: max(const _Tp&amp;,const _Tp&amp;)[with _Tp = std :: basic_string]
<强>解决方案:强>
要么明确地调用你的max
函数,要么只调用std::max
(已经存在,那你为什么要重新实现呢?)。
此外,在;
<< "fmax should be 24.8 -- found: " << fmax << '\n'
太多了