模板类友谊

时间:2014-08-07 12:27:28

标签: c++ friend access-control

我最近遇到了一段c ++代码,其中一个类与自己成为朋友。正如我在不同论坛上所读到的,一个班级已经是他自己的朋友。所以我想知道是否有一个特定的原因,为什么人们想要明确地让自己成为一个阶级朋友。

另一个问题是,让一个班级成为自己的朋友的原因是什么?

也许有经验的人可以澄清这个话题。

以下是代码示例,用于说明我的问题:

template < typename T>
class Foo: public T
{
protected:
   template < typename U>
   friend class Foo;
}

3 个答案:

答案 0 :(得分:19)

确实让一个类成为自己的朋友是没有意义的,除非它是一个模板类。例如,以下代码是有道理的:

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

STL示例是std::_Ptr_base,它是std::shared_ptrstd::weak_ptr的基类。

答案 1 :(得分:4)

这不是让班级成为自己的朋友,而是使该模板的所有班级成为所有其他班级的朋友。因此A<Foo>A<Bar>的朋友,这是一个不同的类。

我很惊讶语法是在你打印时而不是template<typename U> friend class A<U>;,但这实际上意味着它。

答案 2 :(得分:-1)

完全没有理由。 C ++标准并不会使它成为非法,但是使自己的类朋友不会改变任何东西,因为该类已经完全访问它自己。