Maison > développement back-end > C++ > Pourquoi les membres statiques des classes de modèles de base sont-ils inaccessibles dans les classes dérivées ?

Pourquoi les membres statiques des classes de modèles de base sont-ils inaccessibles dans les classes dérivées ?

Patricia Arquette
Libérer: 2024-11-18 00:34:02
original
651 Les gens l'ont consulté

Why are Static Members of Base Template Classes Inaccessible in Derived Classes?

Visibilité des identifiants de classe de modèle de base dans la classe de modèle dérivée

Considérez l'extrait de code 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

Quand compilé avec GCC g 3.4.4 (cygwin), cette compilation de code échoue car NO_ZEROFILL n'est pas visible par la classe de modèle Derived. Ce comportement peut être attribué à une recherche en deux phases en C .

Recherche en deux phases en C

Lorsque le compilateur rencontre une déclaration de modèle, il effectue uniquement une vérification préliminaire recherche des identifiants utilisés dans ce modèle. Étant donné que le type réel de T n'est pas déterminé à ce stade, le compilateur ne peut pas résoudre les identifiants qui dépendent de ce type, tels que Base::NO_ZEROFILL.

Dans le processus de recherche en deux phases :

  1. Préliminaire lookup : Les identifiants sont recherchés dans la portée actuelle et dans les espaces de noms précédemment déclarés.
  2. Instanciation du modèle : Une fois qu'un modèle est instancié avec des paramètres de type spécifiques, une deuxième recherche est effectuée pour retrouver les membres et identifiants instanciés.

Dans ce cas, NO_ZEROFILL n'est pas visible lors de la recherche préliminaire car il dépend du type inconnu T. Par conséquent, vous devez spécifier explicitement Base::NO_ZEROFILL ou this->NO_ZEROFILL dans la classe dérivée pour indiquer qu'elle est membre de la classe de base dont le type est déterminé au moment 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