Почему не работает шаблонная функция? (несоответствие количества аргументов)

Выдаёт ошибку (no instance of function template "max5" matches the argument list) 13 строчка. Не понимаю почему, шаблон на мой взгляд написан правильно.

#include <iostream>
#include <array>

template <class T1, class T2>
T1 max5(T2* arr);

int main()
{
    std::array<int, 5> array1 = { 1, 2, 5, 4, 10 };

    std::cout << max5(&array1);

    return 0;
}

template <class T1, class T2>
T1 max5(T2* arr) {
    T1 value = 0;
    for (int i = 0; i < 5; ++i) {
        if (value < (*arr)[i])
            value = (*arr)[i];
    }

    return value;
}

При этом если заменить на max5<int, std::array<int, 5>>(&array1); то всё выдаёт правильно.


Ответы (1 шт):

Автор решения: Harry

Проблема в том, что T1 из передаваемых функции аргументов никак не выводится.

Например, с тем же успехом T1 может быть как int, так и, например, double.

Поэтому необходимо явно указывать шаблонные параметры. Или изменить шаблон. Что-то типа,

template <class T2>
auto max5(T2* arr) {
    std::decay_t<decltype((*arr)[0])> value = 0;
    for (int i = 0; i < 5; ++i) {
        if (value < (*arr)[i])
            value = (*arr)[i];
    }

    return value;
}

(первое, что пришло в голову; наверняка можно и красивее).

→ Ссылка