2013-03-27 3 views
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 

Почему это происходит, и каков наилучший способ его устранения?

ответ

2

Ваш код

std::string smax = max(max(svec),max(sarray,6)); 

переводит:

std::string smax = max(string ,string); 

После max(svec) и max(sarray,6) оцениваются с использованием шаблонов. Теперь здесь возникает проблема: В стандартную библиотеку уже включена функция templated max(). Компилятор не сможет определить, нужна ли ваша версия max() или std::max(). Теперь вы спросите, почему он работал для целых чисел и поплавков. Ответ в этой строке вы конкретно упоминаете std::string. Следовательно, компилятор запутывается. Там могут быть работы вокруг. Но так как вам нужно лучшее решение, я бы сказал, переименовать свою максимальную функцию сказать MAximum.

+0

Спасибо. Это имеет смысл. – idealistikz

3

Проблема заключается в том, что компилятор находит несколько совпадающих определений max через ADL, и он не знает, что выбрать.

Попробуйте изменить вызов max использовать его квалифицированное идентификатор:

std::string smax = ::max(max(svec),max(sarray,6)); 
+1

@idealistikz, потому что у вас есть опечатка, просто удалите лишнюю точку с запятой на этой линии. –

+0

Как мне заставить его работать с моей определенной функцией 'max', поскольку она работает с другими типами? – idealistikz

+1

работает с другими типами, потому что они не живут в пространстве имен 'std', например' std :: string'. либо по-разному называйте свою функцию (например,'my_max') или использовать свой идентификатор, как показано на рисунке. –

0

Почему этот происходящий?
Ошибка компилятора уже говорит вам, почему. Он не знает, какую версию max использовать.

Примечание: кандидаты:
main.cpp: 6: 38: Примечание: Тип макс (тип, тип) [с Type = станд :: basic_string]
...
/USR/включать /c++/4.7/bits/stl_algobase.h:210:5: примечание: Const _Tp & станд :: макс (Const _Tp &, Const _Tp &) [с _Tp = станд :: basic_string]

Solution :
либо прямо вызовите функцию max, либо просто вызовите std::max (что уже существует, так зачем вам его переопределять?).

Кроме того, есть один ; слишком много после << "fmax should be 24.8 -- found: " << fmax << '\n'

+0

Я хочу переопределить его, потому что я пытаюсь понять функции шаблона. – idealistikz

+0

хорошо, это хорошая причина. – Misch

Смежные вопросы