Pourquoi dois-je avoir pour modèle d'accès de la base de membres de la classe par le biais de la ce pointeur?

Si les classes ci-dessous n'ont pas été des modèles que je pourrait tout simplement x dans le derived classe. Cependant, avec le code ci-dessous, je ont pour utilisation this->x. Pourquoi?

template <typename T>
class base {

protected:
    int x;
};

template <typename T>
class derived : public base<T> {

public:
    int f() { return this->x; }
};

int main() {
    derived<int> d;
    d.f();
    return 0;
}
Ah mon dieu. Il a quelque chose à voir avec la recherche d'un nom. Si quelqu'un n'a pas répondu à ce sujet bientôt, je vais le chercher et de le poster (occupé maintenant).
Swangren: Désolé, j'ai manqué de il parmi l'offre de réponses lors de la publication de cette question. J'avais été à la recherche de la réponse pour un long temps avant que.
Cela arrive parce que les deux en phase de recherche de nom (pas tous les compilateurs utilisent par défaut) et dépendant de noms. Il y a 3 solutions à ce problème, d'autres que de préfixer le x avec this->, à savoir : 1) Utilisez le préfixe base<T>::x, 2) Ajouter un énoncé using base<T>::x, 3) global commutateur de compilateur qui permet à la mode permissif. Les pros & les inconvénients de ces solutions sont décrites dans stackoverflow.com/questions/50321788/...

OriginalL'auteur Ali | 2011-01-10