Accès aux membres protégés à partir de sous-classes: gcc vs msvc
-
10-07-2019 - |
Question
Dans Visual C ++, je peux faire des choses comme ceci:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
Si j'essaie de compiler cela en g ++, j'obtiens une erreur. Je dois faire ceci:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
Ne suis-je pas censé faire le premier en C ++ standard? Ou est-ce que quelque chose de mal configuré avec gcc me donne des erreurs?
La solution
Cela était autorisé auparavant, mais modifié dans 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 associer les noms, par exemple. en les préfixant avec this- > ;. Voici la définition corrigée de C :: h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
Autres conseils
J'ai compris celui-ci:
- Super FAQ C ++: "Pourquoi des erreurs se produisent-elles lorsque mon La classe dérivée de template utilise un type imbriqué hérité de sa classe de base template? & ;
- Super FAQ C ++: "Pourquoi est-ce que je reçois des erreurs La classe dérivée de template utilise un membre hérité de sa classe de base template? & ;
Apparemment, le premier exemple N'EST PAS valide en C ++ et c'est dommage que msvc prenne ceci. Des solutions sont disponibles dans la FAQ C ++.
Vous voudrez peut-être lire des informations sur la recherche de nom en deux phases