Ниже приведена простая программа на языке 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
в обоих случаях.
Итак, вкратце, я был бы признателен за понимание того, как синтаксис этой строки получен или выведен.
Есть много разных сочетаний дружбы и шаблонов.
Ваш настоящий код делает любой шаблонная специализация 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>;
};
ПО МОЕМУ МНЕНИЮ, friend class B<T>;
сработало бы, если бы вы вставили предварительную декларацию
template<class T> class B;
до этого из class A<T>
,
template <class U> friend class B;
делает каждый class B<U>
друг, а не только class B<T>
,