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

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

DDD
DDDoriginal
2024-11-16 03:01:02823parcourir

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

Pourquoi les classes de modèles dérivés perdent l'accès aux identifiants de classe de modèle de base

En C, une classe de modèle dérivée peut ne pas avoir d'accès direct aux identifiants de sa classe de modèle de base. Ce comportement, connu sous le nom de recherche en deux phases, est appliqué par la spécification C.

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();
}

Dans cet exemple, la classe dérivée Derived ne peut pas accéder directement au Identifiant NO_ZEROFILL de sa classe de base Base. En effet, pendant la phase de définition du modèle, le compilateur ne dispose pas d'un type réel substitué à T. Par conséquent, il ne peut pas résoudre les identifiants définis dans Base et nécessite qu'ils soient explicitement qualifiés avec le nom de la classe de base.

Ce comportement garantit que la signification des identifiants dans les classes modèles est bien définie même lorsque la classe est instanciée avec différents types. Chaque instanciation de Base possède son propre ensemble de membres statiques "ZEROFILL" et "NO_ZEROFILL", et le compilateur ne vérifiera la validité du code que lorsque le modèle est instancié avec un argument de type spécifique.

Pour résoudre le problème dans le code fourni, vous pouvez qualifier explicitement l'identifiant NO_ZEROFILL avec le nom de la classe de base, comme indiqué ci-dessous :

Derived( bool initZero = Base<T>::NO_ZEROFILL );

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