1、 在类模板中可以出现三种友元声明,每一种都声明了与一个或多个实体友元关系: (1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。 (2) 类模板或函数模板的友元声明,授予对友元所有实例的访问权。 (3) 只授予对类模板或函数模板的特定实例的访问权的友元声明。
2、 非模板类或非模板函数可以是类模板的友元。这个声明是说,FooBar 的成员和 fcn 函数可以访问 Bar 类的任意实例的 private 成员和 protected 成员。
3、 友元可以是类模板或函数模板。这些友元声明使用与类本身不同的类型形参,该类型形参指的是 Foo1 和 temp1_fcn1 的类型形参。在这两种情况下,都将没有数目限制的类和函数设为 Bar 的友元。Foo1 的友元声明是说,Foo1的任意实例都可以访问 Bar 的任意实例的私有元素,类似地,temp_fcn1 的任意实例可以访问 Bar 的任意实例。
4、 除了将一个模板的所有实例设为友元,类也可以只授予对特定实例的访问权。即使 Foo2 本身是类模板,友元关系也只扩展到 Foo2 的形参类型为 char* 的特定实例。
5、 当授予对给定模板的实例的访问权时候,在作用域中不需要存在该类模板或函数模板的声明。实质上,编译器将友元声明也当作类或函数的声明对待。 想要限制对特定实例化的友元关系时,必须在可以用于友元声明之前声明类或函数。