模板类友元

12
我最近遇到了一段C++代码,其中一个类被赋予了自己的友元。根据我在不同论坛上的阅读,一个类已经是它自己的友元了。因此,我想知道为什么有人会想要明确地将一个类设置为自己的友元。
另一个问题是,为什么要让一个类成为其自身的友元?
也许有经验丰富的人可以澄清这个问题。
以下是代码示例,以说明我的问题:
template < typename T>
class Foo: public T
{
protected:
   template < typename U>
   friend class Foo;
}

1
我能想到的唯一原因是:1)您不想在代码生成器中处理特殊情况,因此它会显示在生成的代码中,或者2)由于重构留下的陈旧代码,由于编译器没有发出警告而被忽略。 - molbdnilo
1
我在不同的论坛上读到过一个类已经是自己的朋友。这是错误的。 - John Dibling
4
它不是自己的朋友。任何Foo的模板实例化都将成为任何其他实例的朋友。关键细节是类模板不是类型。 - juanchopanza
@JohnDibling,你能解释一下为什么它是假的吗? - AlexandraC
3
@AlexandraC:因为一个类本身不可能成为自己的友元,所以这个说法是错误的。你在阅读的论坛可能会将友元关系与访问类的private成员混淆,虽然确实建立友元关系可以授予此类访问权限,但这并不意味着一个类可以成为自己的友元。 - John Dibling
显示剩余8条评论
2个回答

23

除非它是一个模板类,否则让一个类成为自己的友元没有任何意义。例如,以下代码是有意义的:

template <class T>
class A
{
    template<class U>
    friend class A;
}

STL的一个例子是std::_Ptr_base,它是std::shared_ptrstd::weak_ptr的基类。


1
模板是一种很好的观察方式,因为模板类本身就是不同的类型。然而,我想不出一个场景,在这个场景中一个模板可以访问另一个模板无法访问的东西。 - webuster
谢谢!这就是我在寻找的答案。 - AlexandraC
2
std::_Ptr_base是实现细节,不是标准的一部分。而且这三个都与STL无关。 - chris
@chris,我不确定你的意思。STL代表标准模板库,据我所知,智能指针是C++11 STL的一部分。如果我错了,请纠正我。 - rashmatash
2
@rashmatash,你可以阅读这篇文章 - chris
显示剩余4条评论

5

这并不是让类成为自己的友元,而是使该模板的所有类成为其他所有类的友元。因此,A<Foo>A<Bar>的友元,它们是不同的类。

我很惊讶语法是您所打印的而不是template<typename U> friend class A<U>;,但实际上这就是它的意思。


因为它是不正确的,请参见https://dev59.com/Lk_Sa4cB1Zd3GeqP-0Sx,所以翻译为:`template<typename U> friend class A<U>;` - Liu Hao
是的,那就是语法,这是创建类的方式,但如果我的模板需要2个参数,并且我想在友元中使用其中一个参数,那该怎么办呢?所以我有一个类Foo< A, B >,我想让类Foo< A, anything_else >成为友元,而不是具有不同第一个模板参数的Foo类型。 - CashCow

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