Создание экземпляра шаблона классов
В отличие от шаблонов функций при создании экземпляра шаблона класса необходимо явно создать экземпляр класса, предоставив аргументы для шаблонов класса. Создание экземпляра объекта TempClass:
TempClass< float, 6 > test1; // OK
TempClass< char, items++ > test2; // Error, second parameter
// must be constant.
Компилятор создает код для шаблонного класса или функции при создании экземпляра класса или функции. Экземпляр функции-члена создается при вызове этой функции, а экземпляр виртуальной функции-члена создается при создании класса. Это может вызвать проблемы, если библиотека создается с использованием шаблонов для других пользователей. Дополнительные сведения см. в разделе Явное создание экземпляров.
Шаблон класса сначала специализируется, а затем компилятор создает его экземпляр. Компилятор не создает экземпляр шаблона класса до тех пор, пока не создана ссылка на член этого класса шаблонов, не использован параметр sizeof в отношении этого класса, либо не создан экземпляр.
Явная специализация шаблона представляет собой пользовательскую версию шаблона для определенного типа.
// template_instantiation2.cpp
template<class T> class X
{
};
// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}
Явная специализация без template<> создает ошибку. Версии Visual C++ до Visual C++ .NET 2003 принимали следующий синтаксис.
// Explicit specialization of X with 'char'
class X<char> // C2906
{
};
Если явно создан экземпляр шаблона или шаблон специализирован один раз, невозможно явно создать его экземпляр или специализировать его второй раз в той же программе для того же набора аргументов шаблонов. Последующие специализации с другими аргументами шаблонов разрешены.
Если нет явного создания экземпляра или специализации определенного аргумента шаблона, экземпляр шаблона будет создан неявно в точке первого использования.
Поскольку разные операции создания экземпляра одного и того же шаблона являются разными типами, статические члены для одной специализации или создания экземпляра шаблона существуют отдельно от статических членов для другой специализации или создания экземпляров того же шаблона.