2008-10-11 5 views
5

je peux en Visual C++, faire des choses comme ceci:Accès aux membres protégés de sous-classes: gcc vs msvc

template <class T> 
class A{ 
protected: 
    T i; 
}; 

template <class T> 
class B : public A<T>{ 
    T geti() {return i;} 
}; 

Si je tente de le compiler en g ++, je reçois une erreur. Je dois faire ceci:

template <class T> 
class B : public A<T>{ 
    T geti() {return A<T>::i;} 
}; 

Je ne suis pas censé faire le premier en C++ standard? Ou est-ce quelque chose de mal configuré avec gcc qui me donne des erreurs?

+0

Quelle version (s) de gcc? – dmckee

+0

J'utilise gcc 4.2 –

+0

quelle erreur obtenez-vous? –

Répondre

6

Anciennement autorisé, mais modifié en gcc 3.4.

Dans une définition de modèle, les noms non qualifiés ne trouveront plus les membres d'une base dépendante (comme spécifié par [temp.dep]/3 dans la norme C++). Par exemple,

template <typename T> struct B { 
     int m; 
     int n; 
     int f(); 
     int g(); 
    }; 
    int n; 
    int g(); 
    template <typename T> struct C : B<T> { 
     void h() 
     { 
     m = 0; // error 
     f(); // error 
     n = 0; // ::n is modified 
     g(); // ::g is called 
     } 
    }; 

Vous devez rendre les noms dépendant, par ex. en les préfixant avec ceci->. Voici la définition corrigée de h de C,

template <typename T> void C<T>::h() 
    { 
     this->m = 0; 
     this->f(); 
     this->n = 0 
     this->g(); 
    } 
+0

Heh ... vous devez avoir posté en même temps que moi. Il est étrange que msvc accepte cela même si elle est invalide (et causait des erreurs d'exécution bizarres). –

+0

Ya, j'ai vu votre message juste après avoir trouvé les notes de publication. Je pense que probablement les anciennes versions de gcc et de vC++ étaient fausses. Mais gcc a choisi de faire les choses correctement et vC++ a choisi de garder la rétrocompatibilité. –

Questions connexes