Maison >développement back-end >C++ >Pourquoi la recherche de nom non qualifié ne fonctionne-t-elle pas avec les classes de base dépendant des paramètres du modèle en C ?

Pourquoi la recherche de nom non qualifié ne fonctionne-t-elle pas avec les classes de base dépendant des paramètres du modèle en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-04 11:43:10711parcourir

Why Doesn't Unqualified Name Lookup Work with Template Parameter-Dependent Base Classes in C  ?

Classe de base dépendante des paramètres du modèle et recherche de nom non qualifié

En C, lors de la définition d'un modèle de classe, la portée de la classe de base n'est pas examinée lors de la recherche de nom non qualifié si le la classe de base dépend d'un paramètre de modèle. Ce comportement est décrit dans 14.6.2/3 de la norme C.

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

Dans cet exemple, la classe B hérite du modèle de classe A, qui contient un alias de type Vec_t. Cependant, au sein de la classe B, tenter d'utiliser Vec_t sans le qualifier complètement (c'est-à-dire A::Vec_t) entraîne une erreur du compilateur, indiquant que Vec_t n'est pas reconnu.

Pour résoudre ce problème, le nom de l'alias de type doit être pleinement qualifié au sein de la classe B :

template<typename T>
class B : public A<T>
{
private:
    typename A<T>::Vec_t v;  // correct - fully qualified name
};

En effet, lors du nom non qualifié Lors d'une recherche dans la définition d'un modèle de classe ou de son membre, la portée de la classe de base n'est pas examinée si la classe de base dépend d'un paramètre de modèle. Il est donc nécessaire de qualifier explicitement le nom de l'alias de type pour éviter les erreurs du compilateur.

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