Instanciation du modèle de classe
Contrairement aux modèles de fonction, lors de l'instanciation d'un modèle de classe, vous devez instancier explicitement la classe en fournissant les arguments pour les modèles de classe. Pour créer une instance de TempClass :
TempClass< float, 6 > test1; // OK
TempClass< char, items++ > test2; // Error, second parameter
// must be constant.
Le compilateur génère du code pour une classe ou une fonction de modèle lorsque la classe ou la fonction est instanciée. Une fonction membre est instanciée lorsqu'elle est appelée, et une fonction membre virtuelle est instanciée lorsque sa classe est créée. Cela peut entraîner des problèmes si vous créez une bibliothèque avec des modèles pour d'autres utilisateurs. Pour plus d'informations, consultez Instanciation explicite.
Un modèle de classe est d'abord spécialisé, puis instancié par le compilateur. Le compilateur ne peut pas instancier le modèle de classe jusqu'à ce qu'une référence à un membre de cette classe de modèle soit effectuée, sizeof est utilisé sur la classe, ou qu'une instance soit créée.
Une spécialisation explicite d'un modèle est une version personnalisée du modèle pour un type particulier.
// template_instantiation2.cpp
template<class T> class X
{
};
// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}
La spécialisation explicite sans template<> produit une erreur. Les versions de Visual C++ antérieures à Visual C++ .NET 2003 acceptent cette syntaxe :
// Explicit specialization of X with 'char'
class X<char> // C2906
{
};
Si un modèle est explicitement instancié ou spécialisé une fois, il ne peut pas être explicitement instancié ou spécialisé une deuxième fois dans le même programme pour le même ensemble d'arguments template. D'autres spécialisations avec d'autres arguments template sont autorisés.
S'il n'existe pas d'instanciation ou de spécialisation explicite pour un argument template particulier, le modèle sera implicitement instancié au point où il est utilisé pour la première fois.
Étant donné que différentes instanciations du même modèle sont de types différents, les membres statiques pour une spécialisation ou une instanciation d'un modèle sont séparés des membres statiques pour une spécialisation ou une instanciation différente du même modèle.