Когда шаблон функции используется таким образом, что запускает его создание, компилятору (в какой-то момент) необходимо увидеть определение этого шаблона.Именно поэтому шаблоны обычно внедряются в заголовочный файл с использованием встроенных вычислений.
Таким образом, до тех пор, пока соблюдаются вышеуказанные правила, все еще можно разделять интерфейс и реализацию в файлах заголовка и исходного кода.
Ссылка:
C ++ 03 стандарт, § 14.7.2.4:
Определение не-экспортируемый шаблон функции, неэкспортированный шаблон функции-члена или неэкспортированная функция-член или статический член данных шаблона класса должны присутствовать в каждом блоке перевода , в котором он явно создан.