Следующий код выдает ошибку компилятора, когда я его компилирую.
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
// maximum of two C-strings (call-by-value)
inline char const* max (char const* a, char const* b)
{
return strcmp(a,b) < 0 ? b : a;
}
// maximum of three values of any type (call-by-reference)
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
return max (max(a,b), c);
}
int main ()
{
::max(7, 42, 68);
}
При компиляции я получаю ошибку:
ошибка: вызов перегруженного ‘max (const int&, const int&) ‘неоднозначно
примечание: кандидаты:
примечание: const T& max (const T&, const T&) [с T = int]
примечание: const char * max (const char *, const char *)
Как max (const char *, const char *) становится близким совпадением для max (const int&, const int &) когда у нас есть метод шаблона, который соответствует вызову?
Могу поспорить, у вас есть using namespace std
в вашем коде. Удалите его, и все будет в порядке.
Для сравнения: http://ideone.com/Csq8SV а также http://ideone.com/IQAoI6
Если вам строго необходимо использовать пространство имен std, вы можете вызвать вызов корневого пространства имен (как это сделать в main()
):
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
return ::max(::max(a,b), c);
}
Других решений пока нет …