Share via


Crear instancias de plantillas de clase

A diferencia de las plantillas de función, al crear una instancia de una plantilla de clase, debe crear explícitamente una instancia de la clase proporcionando argumentos para las plantillas de clase. Para crear una instancia de TempClass:

TempClass< float, 6 > test1;       // OK
TempClass< char, items++ > test2;  // Error, second parameter 
                                   // must be constant.

El compilador genera código para una función o clase de plantilla cuando se crea una instancia de la clase o función. La instancia de una función miembro se crea cuando se llama a la función y la instancia de una función miembro virtual se crea cuando se crea la clase. Esto puede producir problemas si compila una biblioteca con plantillas para otros usuarios. Para obtener más información, vea Creación explícita de instancias.

Primero se crea una especialización de la plantilla de clase y después el compilador crea una instancia. El compilador no crea instancias de la plantilla de clase hasta que se realiza una referencia a un miembro de esta clase de plantilla, se usa sizeof en la clase o se crea una instancia.

Una especialización explícita de una plantilla es una versión personalizada de la plantilla para un tipo determinado.

// template_instantiation2.cpp
template<class T> class X
{
};

// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}

La especialización explícita sin template<> generará un error. Las versiones de Visual C++ anteriores a de Visual C++ .NET 2003 aceptaban esta sintaxis:

// Explicit specialization of X with 'char'
class X<char> // C2906
{
};

Si se crea explícitamente una instancia o una especialización de una plantilla una vez, no se puede crear una instancia o especialización una segunda vez en el mismo programa para el mismo conjunto de argumentos. Se permiten otras especializaciones con diferentes argumentos de plantilla.

Si no hay una instancia o una especialización explícita para un argumento de plantilla determinado, se creará implícitamente una instancia de la plantilla en el punto donde se use por primera vez.

Como las distintas instancias de la misma plantilla son tipos diferentes, los miembros estáticos de una especialización o instancia de una plantilla son distintos de los miembros estáticos de una especialización o instancia diferente de la misma plantilla.

Vea también

Referencia

Plantillas de clase