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

4
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++中的模板类型不能是友元类?

1个回答

13
通过使用关键字class,您正在前向声明一个名为T的新类型;它并不引用模板参数T。(实际上,它遮蔽了模板参数T。)
只需删除关键字class,那么友元声明就不会前向声明一个新类型。
template<typename T>
class A
{
    friend T;
    int n;
};

自 C++11 起,引入了以下使用方式:friend simple-type-specifier; friend typename-specifier;。有关详细信息,请参见此处。保留 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接