Аргумент для параметра arr
имеет тип int[5]
.Поскольку вы не указали аргумент шаблона для T
при вызове myMax
, происходит выведение аргумента, и T
выводится как int[5]
.
Затем компилятор пытается специализировать шаблон функции с помощьюT = int[5]
(то есть он пытается заменить все экземпляры T
на int[5]
).Это не удается, потому что функция возвращает T
по значению, но невозможно вернуть массив (например, int[5]
) по значению.
Похоже, вы хотите, чтобы T
был типом элемента.Если это так, вы можете явно взять ссылку на массив, например,
template<class T, unsigned N>
T myMax (T (&arr)[N])
Хотя, более идиоматичным способом написания функции было бы использование пары итераторов произвольного доступа ипусть он возвращает итератор, указывающий на элемент "max":
template <typename RandomAccessIt>
RandomAccessIt myMax (RandomAccessIt first, RandomAccessIt last)
first
- итератор первого элемента в диапазоне, а last
- итератор до конца-в-концедиапазона, как это идиоматично для алгоритмов STL.Указатели можно использовать в качестве итераторов произвольного доступа, поэтому эту функцию можно назвать
int* pointerToMaxElement = myMax(arr, arr + arrSize);
Преимущество подхода итератора состоит в том, что он работает с любым диапазоном произвольного доступа, включая массив, std::vector
, * 1029.* и std::deque
.