调用重载模板函数是不明确的

时间:2013-03-27 18:45:05

标签: c++

我有以下代码。

#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

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

3 个答案:

答案 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'太多了