вызов перегруженного 'max (char &, char &)' неоднозначен - PullRequest
3 голосов
/ 02 сентября 2011
#include <iostream>
using namespace std;

int max (int a, int b) 
{ 
   return a<b?b:a; 
} 

template <typename T> T max (T a, T b) 
{ 
   return a<b?b:a; 
} 

template <typename T> T max (T a, T b, T c) 
{ 
   return max (max(a,b), c); 
} 

int main() 
{ 
   // The call with two chars work, flawlessly.
   :: max ('c', 'b');

   // This call with three chars produce the error listed below:
   :: max ('c', 'b', 'a');
   return 0;
}  

Ошибка:

error: call of overloaded ‘max(char&, char&)’ is ambiguous

Разве это max ('c', 'b', 'a') не должно вызывать перегруженную функцию с тремя аргументами?

Ответы [ 2 ]

8 голосов
/ 02 сентября 2011

Дело в том, что уже max в std, и вы говорите using namespace std;:

template <class T> const T& max ( const T& a, const T& b );

Так что ваш max ('c', 'b', 'a') называется хорошим;проблема в нем.

template <typename T> T max (T a, T b, T c) 
{ 
   return max (max(a,b), c); /* Doesn't know which max to pick. */
}

Я не знаю, почему доступен max, поскольку вы не включили algorithm, но, очевидно, это так.

РЕДАКТИРОВАТЬ

Если вы хотите оставить это using наверху:

template <typename T> T max (T a, T b, T c) 
{ 
   return ::max(::max(a, b), c);
} 
3 голосов
/ 02 сентября 2011

НЕТ двусмысленного звонка. http://ideone.com/SJ5Jc (обратите внимание, что вторая строка закомментирована)

Проблема: using namespace std: http://ideone.com/T8tsv

Это вызывает проблемы, поскольку приводит все символы в текущее пространство имен, и кажется, что iostream прямо или косвенно включает заголовок, который определяет std::max. Поэтому, когда вы пишете ::max в своем коде, компилятор не может решить, какой max выбрать: тот, который вы написали, или тот, который определен в стандартной библиотеке.

Удалите using namespace std; из вашего кода.

...