Шаблон класса с шаблоном класса друг, что здесь происходит на самом деле?

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

71
задан Rakete1111 6 December 2016 в 19:27
поделиться