Как метод, принимающий const char * в качестве аргумента, близко соответствует методу, принимающему const int & amp ;?

Следующий код выдает ошибку компилятора, когда я его компилирую.

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 &) когда у нас есть метод шаблона, который соответствует вызову?

3

Решение

Могу поспорить, у вас есть 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector