模板的友元可以分为三类:
- 非模板友元
- 约束模板友元,即友元的类型取决于类被实例化时的类型
- 非约束模板友元,即友元的所有具体化都是类的每一个具体化的友元
1. 模板类的非模板友元,即该友元函数不存在模板,但是该友元函数声明于一个模板类中。
图1
如果没有需要模板类参数,这与普通的类中的友元函数没啥差别。
图2
图3
由于 不存在对象A,而只存在A<T> 即该模板类的一个实例,所以上图中是一个错误的事例,机会出现图三所示的相关提醒。
图4
如果该友元函数需要该模板类参数,就将与约束模板友元类似了。因为该函数将与实例化的模板相关。
2. 约束模板友元,即该友元函数自身是一个模板函数,并且受到该模板类的约束。
图5
需要在模板类之前声明模板函数。图5中可以看出,友元函数均与每一个具体的实例化相关,即会根据模板类中的类型T变换而变换。
3. 非约束模板友元,该友元函数存在模板,但是并不受该模板类的约束。
图6
该模板友元函数的声明放在了模板类中,且该友元函数模板类型与模板类的类型并没有相同之处,也就不会受到模板类的约束。