ЕМ>В данном случае то, что мне нужно — отдельный вопрос.
Основной вопрос был о том, для чего сигнатура шаблонной функции отличается от сигнатуры перегруженной функции с той же комбинацией типов. Один из вариантов — для обеспечения приоритета. Еще могут быть какие-то основания?
Очевидно, для того, чтобы различать функции с одинаковым типом, но инстанциированные из разных шаблонов
template<typename T, typename U> void f(T, U); // 1
template<typename U, typename T> void f(T, U); // 2
int main()
{
f<int, double>(0, 0.); // 1
f<double, int>(0, 0.); // 2
}
(
https://timsong-cpp.github.io/cppwp/n4659/temp.over.link#1)