83 votes

C++ modèle de classe avec classe template ami, ce qui se passe réellement ici?

disons que je suis la création d'une classe pour un arbre binaire, BT, et j'ai de la classe qui décrit un élément de l'arbre, ÊTRE, quelque chose comme

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

Cela semble fonctionner; cependant j'ai des questions au sujet de ce qui se passe dessous.

J'ai d'abord essayé de déclarer l'ami

template<class T> friend class BT;

toutefois, il apparaît nécessaire d'utiliser U (ou quelque chose d'autre que de T) ici, pourquoi est-ce? N'implique qu'un BT de classe est un ami à toute la classe?

IBM page sur des modèles et des amis a des exemples de différents types de relations amicales, de fonctions, mais pas les classes (et devinettes une syntaxe n'a pas convergé sur encore la solution). Je préfère comprendre comment obtenir les spécifications correctes pour le type de la relation d'amitié que je souhaite définir.

117voto

Pubby Points 29386
template<class T> class BE{
  template<class T> friend class BT;
};

N'est pas autorisée, car les paramètres de modèle ne peut pas l'ombre les uns des autres.


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

Cela signifie qu' bar est un ami d' foo , indépendamment de l' bars'arguments de modèle. bar<char>, bar<int>, bar<float>, et tous les autres bar seraient des amis de l' foo<char>.


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

Cela signifie qu' bar est un ami d' foo lorsque bars'argument de modèle correspond foos'. Seulement bar<char> serait un ami de foo<char>.


Dans votre cas, friend class bar<T>; devrait être suffisant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X