Вообще-то параметрами шаблона могут быть не только типы, но и значения интегральных типов (логического типа
bool, всех разновидностей символьных и целочисленных типов), члены перечислений и указатели (а также, на минуточку, другие шаблоны).
Вообще говоря — не нужны, в реальном проектировании не используют, так как к глупым запутываниям и ошибкам ведёт (если не считать какие-нибудь декораторы базовых типов).
Приехали. К глупым ошибкам и запутываниям ведет как раз-таки дублирование кода, одинакового для разных типов. Другое дело, что шаблоны в C++ обладают довольно неудачным синтаксисом и рядом, скажем так, особенностей, из-за чего их лучше и вовсе не использовать в коде, если нет некоторого опыта работы с ними.
Ну, скажем так, можно написать шаблон, суммирующий как целые, так и действительные. Правда, с ублюдочной системой раздельной компиляции ++ это те ещё грабли.
В данном случае никаких грабель не будет, так как заранее известно множество возможных типов

параметров шаблона (это очевидный пример на использование явного инстанцирования). Грабли начинаются, если таковое множество заранее неизвестно...
Операторы

это просто синтаксический сахар, другой (более человекопонятный) способ записи определенных видов функций.