0

我有以下代码。

#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; 
} 

我正在尝试实现两个简单的模板函数来输出向量和数组的最大元素。但是,当类型为字符串时,我收到以下错误。

error: call of overloaded 'max(std::string, std::string)' is ambiguous

为什么会发生这种情况,最好的补救方法是什么?

4

3 回答 3

3

问题是编译器正在寻找多个匹配的maxvia ADL定义,并且不知道该选择哪个。

尝试将调用更改max为使用其限定 ID:

std::string smax = ::max(max(svec),max(sarray,6));
于 2013-03-27T18:54:44.970 回答
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。因此编译器变得混乱。可以有变通办法。但是由于您需要最好的解决方案,我会说将您的 max 函数重命名为 MAximum。

于 2013-03-27T19:02:17.173 回答
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& std::max(const _Tp&, const _Tp&) [with _Tp = std::basic_string]

解决方案:
要么显式调用你的max函数,要么只调用std::max(它已经存在,那么你为什么要重新实现它?)。

另外,后面还有一个;太多<< "fmax should be 24.8 -- found: " << fmax << '\n'

于 2013-03-27T18:58:41.043 回答