Думайте о шаблонах как о генерации кода. Если вы не знаете заранее, с каким шаблоном будет использоваться, вы не сможете скомпилировать. Поэтому вам нужно сохранить реализацию в шапке.
Это допускает некоторые вставки и объясняет, почему иногда использование шаблонных вещей (например, std :: sort) работает быстрее, чем в простом C.