Хоть стандарт и декларирует возможность внешней реализации темплейтов, очень мало компиляторов это поддерживают (необходим специализированный линкер, с вызовом компилятора для использованных темплейтов). Поэтому приходится код темплейтов вставлять в хедер, часто не напрямую, а в отдельный файл с особым расширением типа .tcc или .inl, который включается хедером.
Иногда, если темплейтный код слишком большой, или использует внутренние хедеры, можно извратиться и явно инстанциировать темплейт для нескольких наборов параметров, но при этом приходится мириться с тем, что с непредусмотренными параметрами темплейт обломится на этапе линковки, как у Вас и произошло.
|