Почему при вызове `max(int, long long)` аргумент типа int не расширяется до long long?

211
22 октября 2017, 22:23

Скажите, пожалуйста, почему этот код:

int x = 1;
long long y = 1;
cout << max(x, y) << endl;

не скомпилируется с ошибкой

no matching function for call to 'max(int&, long long int&)'

Есть ведь функция max(long long, long long), что мешает аргументу типа int автоматически преобразоваться в long long?

(чтобы скомпилировалось надо явно преобразовать аргумент типа int к long long, это я знаю)

Answer 1

Никакой "функции max(long long, long long)" нет.

Речь идет о стандартном std::max. И надо иметь в виду, что std::max - это шаблон. Тип аргументов std::max заранее не задан - он является шаблонным параметром. Шаблон этот лишь определен так, что тип аргументов функции должен быть одинаковым.

Из вашего вызова max(x, y) компилятор не может угадать, какой именно тип аргумента std::max вы хотели получить. Может быть вы хотели использовать long long в качестве общего типа. А может быть вы хотели использовать int в качестве общего типа.

Выполнить дедукцию шаблонного аргумента в такой ситуации компилятор не может и компиляция заканчивается с ошибкой. Т.е. проблема заключается именно в невозможности дедукции шаблонного аргумента для std::max.

В данном случае вы можете, например, "подавить" дедукцию шаблонного аргумента, т.е. указать тип шаблонного аргумента явно вручную

max<long long>(x, y)

и тогда действительно аргумент типа int будет неявно преобразован к типу long long, как вы и хотели.

READ ALSO
Как обновить область уведомлений Windows?

Как обновить область уведомлений Windows?

Меняю в реестре флаг "EnableAutoTray" чтобы всегда выводились или скрывались значки в области уведомленийТолько одного изменения в реестре не достаточно,...

280
Не могу сделать перегрузку C++

Не могу сделать перегрузку C++

Не понимаю ошибку(((, надо сделать a[0] + a[2] - например, и чтобы в a[0] добавилась строка a[2];

281
Как &ldquo;найти&rdquo; boost.program_options?

Как “найти” boost.program_options?

В своем проекте на C++ применяю boostprogram_options

216
Разделение string на элементы массива через нужный символ

Разделение string на элементы массива через нужный символ

Подскажите, а способа как использовать <vector> для разделения нужной мне строки на подстроки, которые будут заноситься в массив, нет?

260