Maison > développement back-end > C++ > le corps du texte

Pourquoi ai-je besoin d'un paramètre distinct pour une classe de modèle d'ami dans un modèle de classe ?

Barbara Streisand
Libérer: 2024-11-17 18:40:02
original
228 Les gens l'ont consulté

Why Do I Need a Separate Parameter for a Friend Template Class Inside a Class Template?

Modèle de classe avec un ami de classe modèle : Plonger dans la mécanique

Imaginez construire une classe d'arbre binaire (BT) avec une classe d'éléments (BE ) décrivant chaque nœud, ressemblant à la structure suivante :

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

template<class T> class BT {
    BE<T> *root;
public:
    ...
private:
    ...
};
Copier après la connexion

Cette configuration rencontre une curieuse bizarrerie. Vous tentez de déclarer l'ami comme modèle classe d'amis BT ; échoue, nécessitant l'utilisation d'un paramètre U distinct (ou de tout paramètre non-T).

Cette distinction découle du concept d'observation de modèle. Les paramètres de modèle ne peuvent pas se dupliquer dans le cadre des modèles imbriqués. Par conséquent, différents noms de paramètres sont indispensables pour les modèles imbriqués.

Considérez les constructions suivantes :

template<typename T>
struct foo {
  template<typename U>
  friend class bar;
};
Copier après la connexion

Ici, bar est déclaré comme ami de foo quels que soient ses propres arguments de modèle. Toutes les variantes de bar, qu'elles soient bar, bar, bar ou autres, deviennent amies avec toute instanciation de foo.

En revanche, la déclaration suivante :

template<typename T>
struct foo {
  friend class bar<T>;
};
Copier après la connexion

Implique que bar n'est qu'un ami de foo lorsque l'argument de modèle de bar s'aligne avec foo. Seules les barres serait considéré comme un ami de foo.

Par conséquent, dans votre scénario particulier, en adoptant la forme Friend Class Bar; devrait effectivement établir la relation d'amitié souhaitée entre BE et BT.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal