类模板的非模板功能朋友

时间:2011-04-05 17:11:11

标签: c++ class templates function

在Lippman p656上,我读到了:

  

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

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

我想知道这一切意味着什么。如果fcn成为朋友,那么您希望它能够访问Bar的私有成员,但是如果没有将任何Bar对象传入其中,它怎么能访问它们呢?参数β

有人可以赐教我吗?

2 个答案:

答案 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>。而且,这是不正确的语法。