Если вы хотите определить экземпляры вашего шаблона в отдельных единицах компиляции (что обычно имеет место), то вы не можете определить методы шаблона в отдельном cpp. Каждый метод шаблона должен быть виден компилятору при компиляции модулей компиляции, которые используют этот класс шаблона. Поэтому при использовании шаблона через cpps шаблон должен быть определен в заголовке. Шаблоны - это действительно способы генерирования классов, а не классов сами по себе. Поэтому, когда компилятор видит
YourClass<int>
необходимо увидеть весь шаблон YourClass во время компиляции , чтобы сгенерировать тип с именем
YourClass<int>
и все его методы, которые полностью отделены от, скажем,
YourClass<float>
Это означает, что он должен видеть весь исходный код C ++. Если эти два использования шаблона создаются в отдельных cpp-файлах, то единственный способ, которым компилятор может сгенерировать оба варианта, - полностью определить шаблон в одном заголовке.
Смотрите мой ответ здесь для получения дополнительной информации.
Спасибо за полезные комментарии, которые значительно улучшили этот ответ