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