Шаблонные классы должны быть объявлены и определены в заголовке или другом файле, который добавляется пользователями.Они не могут быть объявлены в заголовке и определены в исходном файле, как обычно.
Причина заключается в том, что шаблон должен быть заменен реальным типом, а источник для этого сгенерирован и скомпилирован при использовании, икомпилятор, конечно, не может предварительно скомпилировать шаблоны для всех возможных типов, поэтому пользователи должны иметь возможность обрабатывать это (и, следовательно, иметь доступ к коду).
Это вызывает некоторые проблемы при передаче объектов, если несколько библиотек содержат одни и те же шаблоны, так как они могут быть скомпилированы для разных версий заголовка (см. Правило одного определения).