Analyse des Template-Rumpfs

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu C++-Spezifikation - Index

Frühere Versionen des Compilers prüften die Syntax im Rumpf von Templates erst bei der Instantiierung der Template. Der Rumpf einer Template wird nun wie jede andere Deklaration sofort analysiert, wenn er sichtbar ist.



 template <class T> class X : T
 {
   Int  j;  // Fehler: Typname in Template X<T> erwartet
 };



Angenommen, Int wurde bislang nicht definiert. Das bedeutet, dass Int ein Member des Template-Arguments T sein muss. Es könnte aber auch einfach ein Tippfehler sein, so dass int anstatt Int gemeint war. Weil der Compiler die richtige Bedeutung nicht erraten kann, gibt er eine Fehlermeldung aus.

Wenn Sie auf Typen zugreifen wollen, die als Template-Argument definiert sind, sollten Sie typedef verwenden, um dem Compiler Ihre Intention unmissverständlich mitzuteilen:



 template <class T> class X : T
 {
   typedef  typename T::Int  Int;
   Int  j;
 };



Sie dürfen nicht einfach



    typedef   T::Int;



schreiben, so wie in früheren Versionen des Compilers. Frühere Compiler-Versionen akzeptierten, dass der typedef-Name angegeben wurde. Dies verursacht nun eine Fehlermeldung.

Alle anderen im Rumpf der Template aufgeführten Templates sind zu diesem Zeitpunkt definiert oder deklariert. Deshalb ist das folgende Beispiel fehlerhaft und wird nicht compiliert:



 template <class T> class  X
 {
   void f(NotYetDefindedTemplate<T> x);
 };



Alle Template-Definitionen müssen mit einem Semikolon enden. Frühere Versionen des Compilers akzeptierten es, wenn das Semikolon fehlte.

Siehe auch