Maison >développement back-end >C++ >Pourquoi ai-je besoin d'un paramètre distinct pour une classe de modèle d'ami dans un modèle de classe ?

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
Barbara Streisandoriginal
2024-11-17 18:40:02276parcourir

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:
    ...
};

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;
};

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>;
};

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!

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