Если библиотека хочет предоставить шаблоны, экземпляры которых могут создавать ее клиенты с произвольными типами, она должна предоставить полные определения шаблонов в заголовочных файлах.Вот почему многие библиотеки C ++, включая большую часть Boost, предназначены только для заголовков.Затем компилятор получает доступ к определению шаблона и может создавать его экземпляры с любыми типами / значениями, которые клиент предоставляет в качестве аргументов шаблона.
Для получения более подробной информации по теме см. Вопрос переполнения стека Почемушаблоны могут быть реализованы только в заголовочном файле? .
Обратите внимание, что это применимо только в том случае, если, как я уже сказал, шаблоны предназначены для использования с произвольными типами.Если набор экземпляров ограничен и может быть определен во время создания разделяемой библиотеки, библиотека может создавать явные экземпляры всех шаблонов, для которых она хочет, всех комбинаций аргументов шаблона, которые она хочет поддерживать.В этом случае раскрытие определений шаблонов не является обязательным, но, разумеется, невозможно будет создавать экземпляры шаблонов с различными типами в клиентском коде.
В качестве примера можно привести некоторые геометрические библиотеки, которыепредоставить свои определения в качестве шаблонов, чтобы они могли работать как с float
, так и с double
для представления чисел с плавающей запятой, но не предоставлять определения шаблонов;они просто предварительно создают весь свой код с помощью float
и double
.Клиенты могут использовать эти экземпляры, но не могут использовать их, например, long double
или MyCustomFloat
.
.