Instanciação do modelo de classe
Ao contrário dos modelos de função, ao criar uma instância de um modelo de classe, você deve criar uma instância da classe explicitamente fornecendo os argumentos do modelo de classe. Para criar uma instância de TempClass:
TempClass< float, 6 > test1; // OK
TempClass< char, items++ > test2; // Error, second parameter
// must be constant.
O compilador gera o código de uma classe ou função de modelo quando uma instância da classe ou função é criada. Uma instância de uma função de membro é criada quando a função é chamada, e uma instância de uma função de membro virtual é criada quando a respectiva classe é construída. Isso poderá causar problemas se você estiver compilando uma biblioteca com modelos para outros usuários. Para obter mais informações, consulte Instanciação explícita.
Para um modelo de classe, primeiro o compilador cria uma especialização, depois uma instância. O compilador não cria uma instância do modelo de classe até que uma referência a um membro dessa classe de modelo seja feita, sizeof seja usado na classe ou uma instância seja criada.
Uma especialização explícita de um modelo é uma versão personalizada do modelo para um tipo específico.
// template_instantiation2.cpp
template<class T> class X
{
};
// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}
Uma especialização explícita sem template<> gerará um erro. As versões do Visual C++ antes do Visual C++ .NET 2003 aceitavam esta sintaxe:
// Explicit specialization of X with 'char'
class X<char> // C2906
{
};
Se uma instância ou uma especialização de um modelo for criada explicitamente uma vez, isso não poderá acontecer uma segunda vez no mesmo programa para o mesmo conjunto de argumentos de modelo. São permitidas especializações adicionais com outros argumentos de modelo.
Se não houver uma instanciação ou uma especialização explícita para um determinado argumento de modelo, uma instância do modelo será criada implicitamente no ponto em que ele é usado primeiro.
Como as diversas instanciações do mesmo modelo são de tipos diferentes, os membros estáticos de uma especialização ou instanciação de um modelo são separados dos membros estáticos de outra especialização ou instanciação do mesmo modelo.