非模板类的友元函数

NonTemplate Function Friend of Class Template

本文关键字:友元 函数      更新时间:2023-10-16

On Lippman p656我读到:

非模板函数或类可以是类模板的友元:

template<class Type> class Bar {
    friend class Foobar;
    friend void fcn();
}; 

我想知道这一切意味着什么。如果fcn是朋友,那是因为你想让它访问Bar的私有成员,但是如果没有任何Bar对象作为参数传入,它怎么能访问它们呢?

有谁能给我点化一下吗?

作为X类的friend意味着友元(无论是函数还是类)可以访问X类的所有私有和受保护成员。

在您的示例中,类Foobar和函数fcn可以访问类Bar的私有和受保护成员。

现在的问题是:

如果没有任何Bar对象作为参数传入,它如何访问它们?

如果它有Bar的实例,它可以访问。例如,

void fcn()
{
   Bar<int> bar;
   bar.PrivateFun(); //okay even if PrivateFun is a private function of Bar
   bar.PrivateData = 10; //okay even if PrivateData is a private data of Bar
}

为了强调两者的区别,考虑另一个函数:

void g()
{
   Bar<int> bar;
   bar.PrivateFun(); //compilation error - g() is not a friend of Bar!
   bar.PrivateData = 10; //compilation error - g() is not a friend of Bar!
}

希望它能帮助你理解访问类的私有成员意味着什么,以及成为类的friend意味着什么!

也许有一个全局的Bar<T>,它可以访问-仅仅因为没有明显的参数并不意味着它不能访问Bar<T>。而且,这是错误的语法。