Скажем, я создаю класс для двоичного дерева 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 на шаблонах и друзья имеет примеры разных типов отношений друзей для функций, но не классов (и угадывание синтаксиса еще не сходилось на решении). Я бы предпочел понять, как правильно получить спецификации для типа отношений друзей, которые я хочу определить.