非模板类的友元函数
NonTemplate Function Friend of Class Template
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>
。而且,这是错误的语法。
相关文章:
- C++模板来检查友元函数的存在
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 未定义的类模板不会实例化以检查友元函数
- C++类中的友元函数有问题?
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 模板类中的模板友元函数
- C++ 17 个友元函数声明和内联命名空间
- 友元函数需要一个帮助程序函数
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 运算符重载在 C++ 中使用友元函数
- 类C++友元函数无法访问封装的类
- 函数指针作为友元函数