Невозможно записать реализацию класса шаблона в отдельный файл cpp и скомпилировать. Все способы сделать это, если кто-то заявляет, - это обходные пути для имитации использования отдельного файла cpp, но практически, если вы намереваетесь написать библиотеку классов шаблонов и распространить ее с файлами заголовков и lib, чтобы скрыть реализацию, это просто невозможно ,
Чтобы узнать почему, давайте посмотрим на процесс компиляции. Заголовочные файлы никогда не компилируются. Они только предварительно обработаны. Предварительно обработанный код затем удаляется с помощью файла cpp, который фактически компилируется. Теперь, если компилятор должен сгенерировать соответствующий макет памяти для объекта, он должен знать тип данных класса шаблона.
На самом деле следует понимать, что шаблонный класс вообще не является классом, а является шаблоном для класса, объявление и определение которого генерируется компилятором во время компиляции после получения информации о типе данных из аргумента. Пока макет памяти не может быть создан, инструкции для определения метода не могут быть сгенерированы. Помните, что первым аргументом метода класса является оператор this. Все методы класса преобразуются в отдельные методы с искажением имени и первым параметром в качестве объекта, с которым он работает. Аргумент «this» фактически указывает на размер объекта, который в случае, если шаблонный класс недоступен для компилятора, если пользователь не создает экземпляр объекта с допустимым аргументом типа. В этом случае, если вы поместите определения методов в отдельный файл cpp и попытаетесь скомпилировать его, сам объектный файл не будет создан с информацией о классе. Компиляция не завершится неудачей, она сгенерирует объектный файл, но не сгенерирует никакого кода для класса шаблона в объектном файле. По этой причине компоновщик не может найти символы в объектных файлах, и сборка завершается неудачно.
Теперь, что является альтернативой, чтобы скрыть важные детали реализации? Как мы все знаем, основная цель отделения интерфейса от реализации - скрыть детали реализации в двоичном виде. Здесь вы должны разделить структуры данных и алгоритмы. Классы вашего шаблона должны представлять только структуры данных, а не алгоритмы. Это позволяет скрыть более ценные детали реализации в отдельных библиотеках не-шаблонизированных классов, классы внутри которых будут работать с шаблонными классами, или просто использовать их для хранения данных. Шаблонный класс на самом деле будет содержать меньше кода для назначения, получения и установки данных. Остальная часть работы будет выполнена классами алгоритма.
Я надеюсь, что это обсуждение будет полезным.