当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的。如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例。
模板的友元分3类:
- 非模板友元;
- 约束模板友元,即友元的类型取决于类被实例化时的类型;
- 非约束模板友元:即友元的所有具体化都是类的每一个具体化的友元。
非模板友元函数
- 友元函数没有类型参数:
template <class T>
class HasFriend
{
public:
friend void counts();
...
};
上述声明使counts()函数成为模板所有实例化的友元。
- 友元函数有模板类型参数:
template <class T>
class HasFriend
{
friend void report(HasFriend<T>