When you use template function with real argument, compiler will extract
type information form real argument, then generate real function code for
you. So it will make compiler looks longer.
Why we need a overload template function, Because not all type support the
same operator. For example, in your template function, you use = operator,
but when you use array for this template function type, compiler will report
error.
Overload is different with Specializations, Overload means that you have
different function signatures. Specialization have the same function
signature.
Given a function name, you can have regular, template and explicit
specialization temple. When pick a function, regular> specialization>
template.