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

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

DDD
Libérer: 2024-11-15 13:53:03
original
902 Les gens l'ont consulté

Why Can't Derived Template Classes Access Base Template Class Identifiers?

Accessibilité des identifiants de classe de modèle de base dans les classes de modèle dérivées

En C, lorsqu'une classe de modèle dérivée hérite d'une classe de modèle de base, il est naturel de s'attendre à ce que la classe dérivée pour avoir accès aux identifiants de la classe de base. Cependant, dans certains scénarios, vous pouvez rencontrer une situation où cet accès est restreint.

Considérez le 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

Dans cet exemple, la classe Derived ne peut pas accéder à l'identifiant NO_ZEROFILL défini dans la classe Base. Ce comportement est dû au mécanisme de recherche en deux phases en C .

Lors de l'expansion du modèle, le modèle de classe de base est instancié avec un type spécifique pour T. Dans ce cas, le compilateur ne connaît pas le type réel de T jusqu'à ce que le modèle soit utilisé. Par conséquent, il ne peut pas résoudre les identifiants de la classe de base qui dépendent de T, tels que NO_ZEROFILL.

Pour résoudre ce problème, vous devez spécifier explicitement le modèle de classe de base lors de l'accès à ses identifiants. Par exemple, vous devrez écrire Derived::NO_ZEROFILL au lieu de simplement NO_ZEROFILL.

Cette spécification explicite de modèle de classe de base demande au compilateur de rechercher l'identifiant NO_ZEROFILL dans le contexte de Derived classe. Cela garantit que l'identifiant correct est trouvé même si le modèle de classe de base n'est pas entièrement instancié au moment de l'expansion 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal