Michael Conlen Michael Conlen - 1 month ago 11
C++ Question

C++ class template with template class friend, what's really going on here?

let's say I'm creating a class for a binary tree, BT, and a I have class which describes an element of the tree, BE, something like

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


This appears to work; however I have questions about what's going on underneath.

I originally tried to declare the friend as

template<class T> friend class BT;


however it appears necessary to use U (or something other than T) here, why is this? Does it imply that any particular BT class is friend to any particular BE class?

The IBM page on templates and friends has examples of different type of friend relationships for functions but not classes (and guessing a syntax hasn't converged on the solution yet). I would prefer to understand how to get the specifications correct for the type of friend relationship I wish to define.

Answer
template<class T> class BE{
  template<class T> friend class BT;
};

Is not allowed because template parameters cannot shadow each other. Nested templates must have different template parameter names.


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

This means that bar is a friend of foo regardless of bar's template arguments. bar<char>, bar<int>, bar<float>, and any other bar would be friends of foo<char>.


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

This means that bar is a friend of foo when bar's template argument matches foo's. Only bar<char> would be a friend of foo<char>.


In your case, friend class bar<T>; should be sufficient.