Допустим, я создаю класс для двоичного дерева, BT
, и у меня есть класс, который описывает элемент дерева, BE
, что-то вроде
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:
...
};
Это похоже на работу; однако у меня есть вопросы о том, что происходит под ним.
Я изначально пытался объявить друга как
template<class T> friend class BT;
однако здесь представляется необходимым использовать U
(или что-то отличное от T
), почему это так? Означает ли это, что какой-то конкретный BT
является другом какого-либо конкретного BE
класса?
На странице IBM, посвященной шаблонам и друзьям, есть примеры различных типов отношений друзей для функций, но не для классов (и предположение, что синтаксис еще не сработал в решении). Я бы предпочел понять, как правильно составить спецификации для типа дружеских отношений, которые я хочу определить.