template<typename T> class A { friend class T; int n; }; struct B { B() { A<B>{}.n; // error : 'n' is a private member of 'A<B>' } }; 为什么C++中的模板类型不能是友元类?
通过使用关键字class,您正在前向声明一个名为T的新类型;它并不引用模板参数T。(实际上,它遮蔽了模板参数T。)只需删除关键字class,那么友元声明就不会前向声明一个新类型。template<typename T> class A { friend T; int n; }; 自 C++11 起,引入了以下使用方式:friend simple-type-specifier; friend typename-specifier;。有关详细信息,请参见此处。保留 HTML 标签。