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