Поделиться через


Создание экземпляра шаблона классов

В отличие от шаблонов функций при создании экземпляра шаблона класса необходимо явно создать экземпляр класса, предоставив аргументы для шаблонов класса. Создание экземпляра объекта 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
{
};

Если явно создан экземпляр шаблона или шаблон специализирован один раз, невозможно явно создать его экземпляр или специализировать его второй раз в той же программе для того же набора аргументов шаблонов. Последующие специализации с другими аргументами шаблонов разрешены.

Если нет явного создания экземпляра или специализации определенного аргумента шаблона, экземпляр шаблона будет создан неявно в точке первого использования.

Поскольку разные операции создания экземпляра одного и того же шаблона являются разными типами, статические члены для одной специализации или создания экземпляра шаблона существуют отдельно от статических членов для другой специализации или создания экземпляров того же шаблона.

См. также

Ссылки

Шаблоны классов