Maison >développement back-end >C++ >Pourquoi ne puis-je pas accéder aux membres protégés de ma classe de base dans une classe dérivée d'un modèle ?

Pourquoi ne puis-je pas accéder aux membres protégés de ma classe de base dans une classe dérivée d'un modèle ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 11:38:02212parcourir

Why Can't I Access Protected Members of My Base Class in a Template Derived Class?

Comprendre l'héritage de modèle et la recherche de noms non dépendants

Considérez l'extrait de code suivant :

<code class="cpp">// arrayListType.h
template <class elemType>
class arrayListType {
protected:
    elemType *list;
    int length;
};

// unorderedArrayListType.h
template <class elemType>
class unorderedArrayListType: public arrayListType<elemType> {
};

// main1.cpp
unorderedArrayListType<int> intList(25);</code>

Compiler ceci Le code entraîne une erreur : "la longueur n'a pas été déclarée dans cette portée", indiquant que les variables protégées de la classe parent, arrayListType, ne sont pas visibles dans la classe héritée, unorderedArrayListType.

Cela est dû à un concept connue sous le nom de recherche de nom non dépendant, qui définit la manière dont le compilateur résout les références aux noms non dépendants dans les modèles. Les noms non dépendants sont ceux qui ne dépendent pas des paramètres du modèle, tels que les variables membres ou les noms de fonctions membres.

Dans ce cas, les variables protégées dans arrayListType sont des noms non dépendants et ne sont pas explicitement défini dans la définition de la classe unorderedArrayListType. Le compilateur ne peut pas déterminer que ces noms existent dans la classe héritée et signale donc une erreur.

Correction de l'erreur

Il existe deux approches courantes pour résoudre cette erreur :

Utiliser ceci-> Préfixe :

Préfixer les noms non dépendants avec this-> indique explicitement qu'ils font référence à des membres hérités :

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    void insertAt(int location, const elemType& insertItem) {
        this->length++;
        this->list[location] = insertItem;
    }
};</code>

Utilisation de déclarations :

L'utilisation de déclarations déclare explicitement les noms non dépendants au sein de la classe héritée :

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    using arrayListType<elemType>::list;
    using arrayListType<elemType>::length;

    void insertAt(int location, const elemType& insertItem) {
        length++;
        list[location] = insertItem;
    }
};</code>

Les deux méthodes communiquent efficacement au compilateur que les noms non dépendants appartiennent à la classe héritée et permettent à la compilation de se dérouler avec succès.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn