Windows-Laufzeit und verwaltete Vorlagen (Komponentenerweiterungen für C++)
Vorlagen können Sie einen Prototyp zum Definieren von der Common Language Runtime oder Laufzeit Fenster und anschließend Variationen dieses Typs instanziiert werden, weil sie unterschiedliche Vorlagen Typparameter verwenden.
Alle Laufzeiten
Sie können Vorlagen vom Wert oder Verweistypen erstellen.Weitere Informationen zum Erstellen des Werts oder Verweistypen finden Sie unter Klassen und Strukturen (Komponentenerweiterungen für C++).
Weitere Informationen dazu finden Sie unter KlassenvorlagenStandard-C++-Klassenvorlagen.
Windows Laufzeit
(Es gibt keine Hinweise für diese Sprachfunktion, die nur für Windows gelten die Common Language Runtime).
Anforderungen
Compileroption: /ZW
Common Language Runtime
Es gibt einige Einschränkungen für die Erstellung von Klassenvorlagen von verwalteten Typen, die in den folgenden Codebeispielen veranschaulicht werden.
Anforderungen
Compileroption: /clr
Beispiele
Beispiel
Es ist möglich, einen generischen Typ mit einem Vorlagenparameter des verwalteten Typs zu instanziieren, sondern eine verwaltete Vorlage mit einem Vorlagenparameter des generischen Typs nicht instanziieren.Dies liegt daran, dass generische Typen zur Laufzeit aufgelöst werden.Weitere Informationen finden Sie unter Generika und Vorlagen (Visual C++).
// managed_templates.cpp
// compile with: /clr /c
generic<class T>
ref class R;
template<class T>
ref class Z {
// Instantiate a generic with a template parameter.
R<T>^ r; // OK
};
generic<class T>
ref class R {
// Cannot instantiate a template with a generic parameter.
Z<T>^ z; // C3231
};
Beispiel
Ein generischer Typ oder eine Funktion kann nicht in einer verwalteten Vorlage geschachtelt werden.
// managed_templates_2.cpp
// compile with: /clr /c
template<class T> public ref class R {
generic<class T> ref class W {}; // C2959
};
Beispiel
Sie können die Vorlagen nicht zugreifen, die in einer Assembly, auf die verwiesen wird, mit Sprachen C++-/CLI Syntax definiert werden. Sie können jedoch mithilfe der Reflektion.Wenn die Vorlage nicht instanziiert wurde, wird sie nicht in Metadaten ausgegeben.Wenn die Vorlage instanziiert wird, nur Memberfunktionen, auf das verwiesen wird, in den Metadaten angezeigt werden.
// managed_templates_3.cpp
// compile with: /clr
// Will not appear in metadata.
template<class T> public ref class A {};
// Will appear in metadata as a specialized type.
template<class T> public ref class R {
public:
// Test is referenced, will appear in metadata
void Test() {}
// Test2 is not referenced, will not appear in metadata
void Test2() {}
};
// Will appear in metadata.
generic<class T> public ref class G { };
public ref class S { };
int main() {
R<int>^ r = gcnew R<int>;
r->Test();
}
Beispiel
Sie können den verwalteten Modifizierer einer Klasse in einer teilweisen Spezialisierung oder der expliziten Spezialisierung einer Klassenvorlage ändern.
// managed_templates_4.cpp
// compile with: /clr /c
// class template
// ref class
template <class T>
ref class A {};
// partial template specialization
// value type
template <class T>
value class A <T *> {};
// partial template specialization
// interface
template <class T>
interface class A<T%> {};
// explicit template specialization
// native class
template <>
class A <int> {};