Freigeben über


Klassenvorlageninstanziierung

Im Gegensatz zu Funktionsvorlagen müssen Sie beim Instanziieren einer Klassenvorlage die Klasse explizit instanziieren, indem Sie die Argumente für die Klassenvorlagen angeben. So erstellen Sie eine Instanz einer TempClass:

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

Der Compiler generiert Code für eine Vorlagenklasse oder Funktion, wenn die Klasse oder die Funktion instanziiert wird. Eine Memberfunktion wird instanziiert, wenn sie aufgerufen wird, und eine virtuelle Memberfunktion wird instanziiert, wenn ihre Klasse erstellt wird. Dies kann Probleme verursachen, wenn Sie eine Bibliothek mit Vorlagen für andere Benutzer erstellen. Weitere Informationen finden Sie unter Explizite Instanziierung.

Eine Klassenvorlage wird vom Compiler erst spezialisiert und dann instanziiert . Der Compiler instanziiert die Klassenvorlage nicht, bis ein Verweis auf einen Member dieser Vorlagenklasse vorliegt, "sizeof" für die Klasse verwendet oder eine Instanz erstellt wird.

Eine explizite Spezialisierung einer Vorlage ist eine benutzerdefinierte Version der Vorlage für einen bestimmten Typ.

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

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

Explizite Spezialisierung ohne template<> erzeugt einen Fehler. Versionen von Visual C++ vor Visual C++ .NET 2003 erwarten diese Syntax:

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

Wenn die Vorlage explizit instanziiert oder einmal spezialisiert wurde, kann sie im selben Programm für den gleichen Satz von Vorlagenargumenten nicht ein zweites Mal explizit instanziiert oder spezialisiert werden. Alle anderen Spezialisierungen mit unterschiedlichen Vorlagenargumenten sind zulässig.

Wenn keine explizite Instanziierung oder eine Spezialisierung für ein bestimmtes Vorlagenargument vorhanden ist, wird die Vorlage implizit an der Stelle instanziiert, an der sie zuerst verwendet wird.

Da es sich bei verschiedenen Instanziierungen der gleichen Vorlage um unterschiedliche Typen handelt, sind statische Member für eine Spezialisierung oder Instanziierung einer Vorlage getrennt von statischen Membern für eine andere Spezialisierung oder Instanziierung der gleichen Vorlage.

Siehe auch

Referenz

Klassenvorlagen