C++ 模板类和友元
模板类的友元分三类:
1,非模板友元。
2,约束模板友元,即友元的类型取决于类被实例化时的类型。
3,非约束模板友元,即友元的所有具体化都是类的每一个具体化的友元。
1,模板类的非模板友元函数
count()函数不是通过对象调用的(它是友元不是成员函数),也没有对象参数,那么它如何访问hasfriend对象?
它可以访问全局对象;可以使用全局指针访问非全局对象;可以创建自己的对象;可以访问独立于对象的模板类的静态数据成员。
report()本身并不是模板函数,而只是使用一个模板作为参数,这意味着必须要为使用的友元定义显式具体化。
2,模板的约束模板友元函数
约束模板友元函数是在类外面声明的模板的具体化。
首先在类定义的前面声明每个函数模板。
然后,在函数中再次将模板声明为友元。声明中的<>指出这是模板具体化。
最后,为友元提供模板定义。
3,模板类的非约束模板友元函数
通过在类内部声明模板,可以创建非约束友元函数,即每个函数具体化都是每个类具体化的友元。对于非约束友元,友元模板类型参数与模板类类型参数是不同的。
此处的show() 函数具体化为:
void show< manyfriend<int> &, manyfriend<double> & > (manyfriend<int> & c, manyfriend<double> & d) ;
类模板的别名
C++11 允许将语法using = 用于模板,用于非模板时,这种语法和常规typedef 等价: