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

xml*_*lmx 4 c++ standards templates friend c++11

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>'
    }
};
Run Code Online (Sandbox Code Playgroud)

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

son*_*yao 13

通过使用关键字class,您可以向前声明一个名为的新类型T; 其中没有引用模板参数T.(它T实际上会影响模板参数.)

只需删除关键字class,然后友元声明将不转发声明新类型.

template<typename T>
class A
{
    friend T;
    int n;
};
Run Code Online (Sandbox Code Playgroud)

这个用法(friend simple-type-specifier ; friend typename-specifier ;)是从C++ 11开始引入的.