Скажите, пожалуйста, почему этот код:
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
, это я знаю)
Никакой "функции 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
, как вы и хотели.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Меняю в реестре флаг "EnableAutoTray" чтобы всегда выводились или скрывались значки в области уведомленийТолько одного изменения в реестре не достаточно,...
Не понимаю ошибку(((, надо сделать a[0] + a[2] - например, и чтобы в a[0] добавилась строка a[2];
Подскажите, а способа как использовать <vector> для разделения нужной мне строки на подстроки, которые будут заноситься в массив, нет?