Maison > développement back-end > C++ > Pourquoi les classes de modèles dérivées ne peuvent-elles pas accéder directement aux identifiants des classes de modèles de base ?

Pourquoi les classes de modèles dérivées ne peuvent-elles pas accéder directement aux identifiants des classes de modèles de base ?

Barbara Streisand
Libérer: 2024-11-17 02:46:03
original
938 Les gens l'ont consulté

Why Can't Derived Template Classes Directly Access Identifiers from Base Template Classes?

Identifiants de classe de modèle de base inaccessibles dans les classes dérivées : un cas de recherche en deux phases

Lorsque vous travaillez avec des classes de modèles, il est essentiel de comprendre les implications de la recherche en deux phases. En C , les identifiants dans une définition de classe modèle ne sont pas entièrement résolus lors de la compilation. Au lieu de cela, ils sont résolus lors de l'instanciation du modèle en fonction des arguments de type réels fournis. Cela peut conduire à des situations dans lesquelles une classe de modèle dérivée ne peut pas accéder directement aux identifiants de sa classe de modèle de base.

Considérons l'exemple suivant :

template <typename T>
class Base {
public:
    static const bool ZEROFILL = true;
    static const bool NO_ZEROFILL = false;
};

template <typename T>
class Derived : public Base<T> {
public:
    Derived(bool initZero = NO_ZEROFILL);  // NO_ZEROFILL is not visible
    ~Derived();
};
Copier après la connexion

Dans ce code, la classe de modèle dérivée hérite de la classe de modèle de base. Cependant, lors de la compilation de ce code, une erreur se produit car la classe Derived tente d'utiliser l'identifiant NO_ZEROFILL de la classe Base sans le qualifier avec le nom de la classe de base.

Ce comportement est dû à une recherche en deux phases. Au cours de la première phase de compilation, le compilateur traite la définition du modèle sans substituer aucun argument de type réel à T. Par conséquent, le compilateur ne peut pas déterminer l'existence d'identifiants spécifiques dans Base. Ce n'est que lors de la deuxième phase, lorsque le modèle est instancié pour un type spécifique (par exemple, Derived), que le compilateur peut résoudre les identifiants et vérifier leur existence.

Pour résoudre ce problème, vous devez spécifier explicitement le nom de la classe de base lors de l'accès aux identifiants de la classe du modèle de base. Cela peut être fait en utilisant Base::NO_ZEROFILL ou this->NO_ZEROFILL, où this fait référence à une instance de la classe Derived. Ce faisant, vous informez le compilateur que l'identifiant est défini dans la classe de base et doit être résolu lors de l'instanciation du modèle.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal