На мой взгляд, шаблоны и наследование - это буквально ортогональные понятия: наследование является «вертикальным» и идет вниз от абстрактного к более конкретному. Форма, треугольник, равносторонний треугольник.
Шаблоны, с другой стороны, являются "горизонтальными" и определяют параллельные экземпляры кода, которые ничего не знают друг о друге. Сортировка целых чисел формально такая же, как сортировка двойников и сортировка строк, но это три совершенно разные функции. Все они издалека «выглядят» одинаково, но не имеют ничего общего друг с другом.
Наследование обеспечивает абстракцию во время выполнения. Шаблоны генерация кода инструменты.
Поскольку понятия ортогональны, их можно с радостью использовать вместе для достижения общей цели. Мой любимый пример этого - стирание типов , в котором контейнер для стирания типов содержит виртуальный базовый указатель на класс реализации, но существует произвольное количество конкретных реализаций, которые генерируются производным от шаблона классом. Генерация кода шаблона служит для заполнения иерархии наследования. Магия.