Creazione di istanze di modelli di classe
A differenza dei modelli di funzione, quando viene creata un'istanza del modello di classe, è necessario creare l'istanza della classe in modo esplicito fornendo gli argomenti per i modelli di classe. Per creare un'istanza dell'oggetto TempClass:
TempClass< float, 6 > test1; // OK
TempClass< char, items++ > test2; // Error, second parameter
// must be constant.
Il compilatore genera codice per una classe di modello o una funzione quando viene creata un'istanza della classe o della funzione. Viene creata un'istanza di una funzione membro quando viene chiamata e viene creata un'istanza di una funzione membro virtuale quando viene costruita la relativa classe. Ciò potrebbe provocare dei problemi se si compila una libreria con i modelli di altri utenti. Per ulteriori informazioni, vedere Creazione esplicita di un'istanza.
Un modello di classe viene prima specializzato, quindi viene creata un'istanza di tale modello dal compilatore. Il compilatore non crea un'istanza del modello di classe fino a quando non viene effettuato un riferimento a un membro di questa classe di modello; nella classe viene utilizzato sizeof oppure viene creata un'istanza.
Una specializzazione esplicita di un modello è una versione personalizzata del modello per un determinato tipo.
// template_instantiation2.cpp
template<class T> class X
{
};
// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}
La specializzazione esplicita senza template<> genererà un errore. Versioni di Visual C++ precedenti Visual C++ .NET 2003 accettate da questa sintassi:
// Explicit specialization of X with 'char'
class X<char> // C2906
{
};
Se viene creata un'istanza in modo esplicito di un modello o se viene specializzato una volta, non può essere creata un'istanza in modo esplicito o non può essere specializzato una seconda volta nello stesso programma per lo stesso set di argomenti di modello. Sono consentite ulteriori specializzazioni con argomenti di modello diversi.
Se non esiste la creazione esplicita di un'istanza o la specializzazione esplicita di un argomento di modello particolare, verrà creata un'istanza in modo implicito del modello nel punto in cui è stato utilizzato per la prima volta.
Poiché le creazioni di istanze diverse dello stesso modello sono di diverso tipo, i membri statici di una specializzazione o di una creazione di un'istanza di un modello sono separati dai membri statici di una specializzazione o creazione di un'istanza diverse dello stesso modello.