Analyse du corps de template

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Spécificités du C++ - Index

Les versions précédentes du compilateur ne vérifiaient pas la syntaxe du corps d'un template sauf si le template était instancié. Désormais le corps d'un template est immédiatement analysé dès qu'il est rencontré comme toutes les autres déclarations.



 template <class T> class X : T
 {
   Int  j;  // Erreur : Nom de type attendu dans template X<T>
 };



Supposons que Int n'ait pas été défini jusque là. Cela signifie que Int doit être un membre de l'argument template T. Mais cela peut n'être qu'une erreur de frappe et devrait être int et non pas Int. Comme le compilateur ne peut deviner la bonne interprétation, il génère un message d'erreur.

Pour accéder aux types définis dans un argument template, utilisez un typedef pour clarifier vos intentions pour le compilateur :



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



Il n'est pas possible d'écrire uniquement



    typedef   T::Int;



comme dans les versions précédentes du compilateur. Ne pas spécifier le nom de typedef était acceptable, désormais cela provoque un message d'erreur.

Tous les autres templates mentionnés à l'intérieur du corps du template sont déclarés ou définis à ce point. Donc, l'exemple suivant est incorrect et ne passe pas à la compilation :



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



Toutes les définitions de template doivent se terminer par un point-virgule. Les versions antérieures du compilateur ne réagissaient pas à l'absence du point-virgule.

Voir aussi