以下是一个简单的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
。
因此,简而言之,我对如何推导或推导出该行的语法有所了解。
答案 0 :(得分:5)
友谊和模板有许多不同的排列。
您现有的代码会将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>;
};
答案 1 :(得分:3)
恕我直言,friend class B<T>;
如果您插入了前瞻性声明
template<class T> class B;
之前的class A<T>
。
template <class U> friend class B;
让每个class B<U>
成为朋友,而不只是class B<T>
。