Попытка понять «шаблон» класса U & gt; друг класс B; & quot; синтаксис

Ниже приведена простая программа на языке c ++, которая компилируется с моим компилятором MinGW и выполняется так, как ожидается:

#include <iostream>template <class T> class A {
T a;
template <class U> friend class B;

public:
A<T> (T t) : a(t) {}
};template <class T> class B {
A<T> aa;

public:

B<T> (T t) : aa(t) {}

T getT() const {return aa.a;}
};int main() {
B<int> b(5);
std::cout << "> " << b.getT() << std::endl;
}

поскольку B<T>::getT() доступ к частный A<T>::a член, A<T> марки B<T> друг с template <class U> friend class B; линия.

К сожалению я не знаю Зачем эта строка должна быть написана так Интуитивно я бы ожидал что-то вроде friend class B<T>Тем не менее, это не компилируется.

Смысл вновь введенного U неясно также, так как Aи Bзависимый тип T в обоих случаях.

Итак, вкратце, я был бы признателен за понимание того, как синтаксис этой строки получен или выведен.

1

Решение

Есть много разных сочетаний дружбы и шаблонов.

Ваш настоящий код делает любой шаблонная специализация B в друга для A<T>так например B<char> друг A<int>,

Если бы вы только хотели сделать соответствие A<T> друг, вы бы сказали это так:

template <typename> class B;  // forward declare above!

template <typename T>
class A
{
// ...

friend class B<T>;
};
5

Другие решения

ПО МОЕМУ МНЕНИЮ, friend class B<T>; сработало бы, если бы вы вставили предварительную декларацию

template<class T> class B;

до этого из class A<T>,

template <class U> friend class B; делает каждый class B<U> друг, а не только class B<T>,

3

По вопросам рекламы [email protected]