Maison >développement back-end >C++ >Pourquoi utiliser différents paramètres de modèle pour les classes d'amis dans les modèles imbriqués ?

Pourquoi utiliser différents paramètres de modèle pour les classes d'amis dans les modèles imbriqués ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-14 20:50:02942parcourir

Why Use Different Template Parameters for Friend Classes in Nested Templates?

Modèles de classe d'amis dans des modèles imbriqués

Considérez le scénario de définition d'un modèle de classe pour un arbre binaire (BT) et un élément dans l'arbre (BE). Lors de la déclaration de l'amitié entre ces classes, pourquoi est-il nécessaire d'utiliser un paramètre de modèle différent pour la classe amie par rapport à la classe contenant ?

En C , les paramètres de modèle ne peuvent pas s'observer mutuellement. Dans le cadre de modèles imbriqués, les paramètres de modèle du modèle interne doivent avoir des noms différents de ceux des paramètres de modèle du modèle externe.

Par exemple, dans le code suivant :

template<class T> class BE {
    T *data;
    BE *l, *r;
public:
    template<class U> friend class BT;
};

Le paramètre de modèle U de la classe amie BT est utilisé pour le différencier du paramètre de modèle T de la classe BE. Ceci spécifie que BT est un ami de BE quels que soient les arguments du modèle de BT.

Cependant, si vous déclarez la classe d'ami comme suit :

template<class T> friend class BT;

Cela implique que toute instanciation particulière de BT est un ami à toute instanciation particulière de BE. Pour spécifier une amitié plus spécifique, vous pouvez utiliser la syntaxe suivante :

template<typename T>
struct foo {
    friend class bar<T>;
};

Cela indique que bar est un ami de foo uniquement lorsque l'argument de modèle de bar correspond à l'argument de modèle de foo. Dans votre cas, en utilisant la barre de classe d'amis; devrait suffire à établir la relation d'amitié souhaitée.

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