Явное создание экземпляра
Явное создание экземпляров можно использовать для создания шаблонного класса или функции, чтобы обойтись без их использования в коде. Поскольку это полезно для создания файлов библиотек (.lib), в которых шаблоны используются для распространения, то определения шаблонов без создания экземпляров не включаются в объектные файлы (.obj).
В следующем примере кода создается экземпляр класса MyStack для переменных int и 6 элементов.
template class MyStack<int, 6>;
Этот оператор создает экземпляр класса MyStack, но не резервирует пространство в памяти для полученного объекта. Код создается для всех членов.
В следующей строке явное создание экземпляра выполняется только для функции-члена конструктора.
template MyStack<int, 6>::MyStack( void );
Как показано в примере в разделе Создание экземпляра шаблона функции, создавать экземпляры шаблонов функций можно явным образом, используя аргумент определенного типа, чтобы повторно декларировать их.
Ключевое слово extern позволяет предотвратить автоматическое создание экземпляров элементов. Например:
extern template class MyStack<int, 6>;
Аналогично, определенные элементы можно пометить как внешние, для которых не был создан экземпляр.
extern template MyStack<int, 6>::MyStack( void );
Ключевое слово extern позволяет запретить компилятору формировать один и тот же код создания экземпляра более чем в одном объектном модуле. Если функция вызывается, то экземпляр шаблонной функции должен быть создан с использованием заданных явных параметров шаблона по меньшей мере в одном связанном модуле; в противном случае при сборке программы возникнет ошибка компоновщика.
Примечание
Ключевое слово extern в специализации применяется только к функциям-членам, которые были определены за пределами тела класса.Функции, определенные внутри объявления класса, рассматриваются как подставляемые; для них всегда создаются экземпляры.