Maison >développement back-end >C++ >Comment fonctionne la propagation de type « typedef » des classes de base aux classes dérivées dans les modèles C ?

Comment fonctionne la propagation de type « typedef » des classes de base aux classes dérivées dans les modèles C ?

DDD
DDDoriginal
2024-12-09 04:31:14854parcourir

How Does `typedef` Type Propagation Work from Base to Derived Classes in C   Templates?

Propagation de type de 'typedef' de la base à la classe dérivée pour les modèles

En C, il est possible de définir des typedefs au sein d'une classe de base pour fournir des alias pratiques pour des tâches spécifiques. types de données. Cependant, lors de l'utilisation d'une classe de base basée sur un modèle, il est crucial de comprendre le mécanisme de propagation de ces typedefs vers les classes dérivées.

Considérons l'exemple suivant :

template<typename T>
class A {
public:
    typedef std::vector<T> Vec_t;
};

template<typename T>
class B : public A<T> {
private:
    Vec_t v; // fails - Vec_t is not recognized
};

Ici, la classe de base la classe A définit un typedef nommé Vec_t pour un vecteur de type T. Dans la classe dérivée B, lorsque vous tentez d'utiliser Vec_t sans le qualifier complètement (par exemple, typename A::Vec_t), le compilateur génère une erreur.

Ce comportement est expliqué par le standard C (14.6.2/3). Selon la norme, "Dans la définition d'un modèle de classe ou d'un membre d'un modèle de classe, si une classe de base du modèle de classe dépend d'un paramètre de modèle, la portée de la classe de base n'est pas examinée lors de la recherche de nom non qualifié."

Par conséquent, dans la classe dérivée B, l'identifiant non qualifié Vec_t n'est pas reconnu car le compilateur n'examine pas la portée de la classe de base pour la recherche de nom non qualifié. Pour accéder correctement au typedef, il est nécessaire de qualifier complètement le nom en utilisant la syntaxe typename A::Vec_t.

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