Question

J'ai un ancien code ici, où ils utilisaient des variables membres protégées. Que ce soit ou non une bonne idée peut être discuté. Cependant, le code doit avoir été correctement compilé avec gcc3. J'ai un modèle de classe dérivé Bar qui utilise le membre protégé x du modèle de classe Foo comme si

template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

template <class Something> Bar : Foo<Something> {
public:
  void cleanup();
}

Et dans la déclaration de méthode de cleanup (), quelque chose est fait avec x

template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

Cela ne fonctionne pas avec gcc4, bien que cela aurait dû fonctionner avec gcc3. Cela fonctionne quand je le change en

doSomeThingCleanUpLike (this->x);

Pourquoi est-ce le cas?

Était-ce utile?

La solution

L'expression x utilisée dans la classe dérivée est, selon les règles du standard, non dépendante d'aucun paramètre de modèle de la classe dérivée. De ce fait, la recherche a lieu dans le contexte de la définition du modèle et non au point d'utilisation / d'instanciation. Même si la classe de base de modèle du modèle semble être visible, étant donné qu’il s’agit d’une classe de modèle, l’instanciation particulière pouvant être utilisée peut impliquer des modèles spécialisés, de sorte que la définition du modèle de classe de base ne peut pas être utilisée pour la recherche de nom.

En remplaçant l'expression par this- > x , vous en faites une expression dépendante ( this dans un modèle de classe dépend toujours des paramètres de modèle). Cela signifie que la recherche aura lieu dans le contexte d'instanciation, moment auquel la classe de base sera entièrement connue et ses membres visibles.

Autres conseils

Lorsque vous définissez le modèle dérivé, le compilateur connaît uniquement le nom de la classe de modèle de base, mais pas ses détails. Le compilateur ne sait donc pas que la classe dérivée possède un membre hérité. Pour informer le compilateur de l'existence du membre, utilisez this- > , tout comme vous l'avez fait.

En fait, il s'agit d'un doublon de la question .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top