在Lippman p656上,我读到了:
非模板函数或类可以是类模板的朋友:
template<class Type> class Bar {
friend class Foobar;
friend void fcn();
};
我想知道这一切意味着什么。如果fcn
成为朋友,那么您希望它能够访问Bar
的私有成员,但是如果没有将任何Bar
对象传入其中,它怎么能访问它们呢?参数β
有人可以赐教我吗?
答案 0 :(得分:5)
成为类friend
的{{1}}意味着朋友(无论是函数还是类)可以访问类X
的所有私有成员和受保护成员。
在您的示例中,类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!
}
意味着什么!
答案 1 :(得分:0)
也许它可以访问全局Bar<T>
- 只是因为没有明显的参数并不意味着它无法访问Bar<T>
。而且,这是不正确的语法。