为什么模板类型不能成为 C++ 中的友元 class?

Why can't a template type be a friend class in C++?

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?

使用关键字 class,您将向前声明一个名为 T 的新类型;它不引用模板参数 T。 (它实际上隐藏了模板参数 T。)

只需删除关键字class,则友元声明不会转发声明新类型。

template<typename T>
class A
{
    friend T;
    int n;
};

This usage (friend 简单类型说明符; friend 类型名称说明符 ;) 自 C++11 起引入。