类模板的非模板功能朋友

Ran*_*lus 0 c++ templates class function

在Lippman p656上,我读到:

nontemplate函数或类可以是类模板的朋友:

template<class Type> class Bar {
    friend class Foobar;
    friend void fcn();
}; 
Run Code Online (Sandbox Code Playgroud)

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

有人可以赐教这个吗?

Naw*_*waz 5

作为一个friendX意味着朋友(无论是函数还是类)可以访问该类的所有私有和受保护成员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
}
Run Code Online (Sandbox Code Playgroud)

只是为了强调差异,考虑另一个功能:

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

希望它可以帮助您理解访问类的私有成员意味着什么,以及成为friend一个类的意义!