Erreur de compilation GCC : accès au membre de la classe de base dépendant de l'argument du modèle
En C, lors de l'héritage d'une classe modèle, l'accès aux membres de la La classe de base au sein de la classe dérivée peut parfois poser un défi, comme l'a rencontré cet utilisateur. Un extrait de code est fourni :
<code class="cpp">template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } };</code>
Lors de la compilation de ce code avec GCC, l'utilisateur rencontre l'erreur :
error: ‘foo’ was not declared in this scope
Cependant, le membre problématique 'foo' doit être accessible dans le classe dérivée.
Le problème vient du fait que, en C 11 et versions ultérieures, le compilateur n'est plus autorisé à déduire automatiquement les types de variables dans les modèles imbriqués. Cette restriction empêche le compilateur de déduire l'existence du membre 'foo' dans la classe de base lors de la compilation de la classe dérivée.
Pour résoudre le problème, le membre est accessible explicitement via le nom de la classe de base :
<code class="cpp">void bar() { cout << A<T>::foo << endl; }
Alternativement, le pointeur 'this' peut être utilisé :
<code class="cpp">void bar() { cout << this->foo << endl; }</code>
Ces solutions indiquent explicitement que le membre 'foo' appartient à la classe de base, garantissant que le compilateur peut identifier correctement et résoudre son utilisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!