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