Перегрузка шаблона функций с несколькими совпадениямиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перегрузка шаблона функций с несколькими совпадениями

Сообщение Anonymous »

У меня есть две функции шаблона max , и попытаться вызвать одну из них.

Код: Выделить всё

    #include 
#include 

template 
auto max(T1 a, T2 b) {
return b < a ? a : b;
}

template 
RT max(T1 a, T2 b) {
return b < a ? a : b;
}

int main(void) {
max(4, 7.2);
return 0;
}
Здесь, max (4, 7.2) вызывает двусмысленность, генерируя ошибку компиляции.

Код: Выделить всё

: In function 'int main()':
:15:13: error: call of overloaded 'max(int, double)' is ambiguous
15 |     max(4, 7.2);
|     ~~~~~~~~^~~~~~~~
:5:6: note: candidate: 'auto max(T1, T2) [with T1 = int; T2 = double]'
5 | auto max(T1 a, T2 b) {
|      ^~~
:10:4: note: candidate: 'RT max(T1, T2) [with RT = int; T1 = int; T2 = double]'
10 | RT max(T1 a, T2 b) {
|    ^~~
Compiler returned: 1
Две функции Max можно интерпретировать следующим образом при вызове Max (4, 7.2) :

Код: Выделить всё

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

int max(int a, double b) {
return b < static_cast(a) ? static_cast(a) : b;
}
Компилятор может предпочесть первый вариант, поскольку он имеет более высокую точность при возврате значения.
Почему в этом случае возникает неоднозначность?

Подробнее здесь: https://stackoverflow.com/questions/793 ... le-matches
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»