Это потому, что std :: max должны быть заданы два параметра одного и того же типа, тогда как int
и long long int
- это два разных типа. Если вы напишите std::max(0, a[i]-b[i])
, он не скомпилируется, потому что тип a[i]-b[i]
равен long long int
, а тип 0
равен int
.
Более длинный ответ:
std::max
- это шаблон функции. Используемая вами перегрузка имеет один шаблонный параметр T
и два параметра const T& a
и const T& b
. Когда вы вызываете std::max
, вы можете явно указать параметр шаблона следующим образом:
std::max<long long int>(0, a[i]-b[i])
В этом случае компилятор сгенерирует функцию, которая получит два long long int
с, и вы можете на самом деле передать что угодно можно преобразовать в long long int
функцию.
Однако, если вы не укажете параметр шаблона T
, вычет аргумента шаблона попытается вывести его для вас.
Вот как это работает. Первый параметр - const T& a
, поэтому компилятор пытается вывести T
на основе того, что вы передали в качестве аргумента. Вы передаете 0
, поэтому компилятор определяет, что T
является int
Затем компилятор пытается вывести T
, используя второй параметр const T& b
. Вы передали long long int
, поэтому компилятор определяет, что T
должен быть long long int
.
Затем компилятору не удается создать экземпляр шаблона функции, поскольку он вывел конфликтующие типы для того же параметра шаблона.
Если не создать экземпляр шаблона функции std::max
с указанными аргументами, компилятор не может найти подходящую функцию для вызова, поэтому вы получаете ошибку компиляции.