ошибка: вызов перегруженного «max (int, int)» неоднозначен - PullRequest
7 голосов
/ 01 февраля 2012
#include <iostream>

using namespace std;

template<typename T>
T max(T lhs, T rhs)
{
  return lhs < rhs ? rhs : lhs;
}
template<>
int max<int>(int lhs, int rhs)
{
  return lhs < rhs ? rhs : lhs;
}

int main()
{
  cout << max<int>(4, 5) << endl;

}

~/Documents/C++/boost $ g++ -o testSTL testSTL.cpp -Wall
testSTL.cpp: In function ‘int main()’:
testSTL.cpp:18:24: error: call of overloaded ‘max(int, int)’ is ambiguous
testSTL.cpp:11:5: note: candidates are: T max(T, T) [with T = int]
/usr/include/c++/4.5/bits/stl_algobase.h:209:5: note:                 const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]

Как мне исправить эту ошибку?

Ответы [ 6 ]

19 голосов
/ 01 февраля 2012

Это все из-за твоего using namespace std;. Удалить эту строку. С помощью этой директивы using вы вводите std::max (который должен быть каким-то образом включен через iostream) в глобальную область видимости. Поэтому компилятор не знает, какой max вызвать - ::max или std::max.

Я надеюсь, что этот пример станет хорошим пугалом для тех, кто считает, что использование директив происходит бесплатно. Странные ошибки - один побочный эффект.

5 голосов
/ 01 февраля 2012

Я думаю, компилятор не может решить, использовать ли std :: max или ваш max, потому что у вас есть использование пространства имен std; и ваш max и std :: max отвечают всем требованиям

4 голосов
/ 01 февраля 2012

У вас есть и ваши max и std::max. Компилятор не знает, какую из них вы намеревались вызвать.

Вы можете сказать это, позвонив ::max(4,5) или std::max(4,5), или, что еще лучше, не указав using namespace std в файле.

4 голосов
/ 01 февраля 2012

Вы сталкиваетесь с std::max(). Переименуйте его во что-то еще, например mymax, и оно будет работать.

3 голосов
/ 01 февраля 2012

Это потому, что уже определена шаблонная функция std :: max.Удалите 'using namespace std' и добавьте 'std ::', где это необходимо., Или используйте ':: max'.

2 голосов
/ 01 февраля 2012

Проблема в том, что уже есть функция с именем 'max', определенная в std. Чтобы это исправить, переименуйте вашу функцию во что-то еще, например:

#include <iostream>

using namespace std;

template<typename T>
T mymax(T lhs, T rhs)
{
    return lhs < rhs ? rhs : lhs;
}
template<>
int mymax<int>(int lhs, int rhs)
{
    return lhs < rhs ? rhs : lhs;
}

int main()
{
    cout << mymax<int>(4, 5) << endl;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...