Вы должны поместить большинство частей шаблона в заголовочный файл.Это в равной степени относится как к шаблонным классам, так и к шаблонным функциям в обычных классах.
Исключение, которое вы должны знать из этого правила, заключается в том, что когда вы специализируете шаблон, вы должны поместить специализацию в реализацию / .cpp.файл, потому что специализация является конкретным типом.С другой стороны, фактические определения шаблона необходимо будет выполнить несколько раз, по одному для каждого типа параметра шаблона, используемого с шаблоном, - поэтому они должны идти в заголовочном файле (они не являются конкретными по типу).
например, поместите:
template typename<T> foo(T val) { std::cerr << "DEFAULT"; }
в заголовочный файл и его специализацию для int:
template<> foo<int>(int val) { std::cerr << "INT"; }
в файле cpp, потому что версия int является конкретной полностью определенной функциейв то время как версия T является определением шаблона, которое будет использоваться много раз для генерации множества конкретных функций.