//友元
//前置声明,在Blob中声明友元所需要的。为了引用模板的一个特定实例,必须首先声明模板自身。
template<typename> class BlobPtr;
template<typename> class Blob;
template<typename T>
class Blob {
public:
//友元
friend class BlobPtr<T>;
friend bool operator==(const Blob<T>&, const Blob<T>&);
};
template<typename T>
bool operator==(const Blob<T>&, const Blob<T>&);
Blob<char> ca;//Blob<char>和operator==<char>都是本对象的友元
Blob<int> ia;//Blob<int>和operator==<int>都是本对象的友元
//通用和特定的模板友元关系
//一个类也可以将另一个模板的每个实例都声明为自己的友元,或者限定特定的实例为友元
template<typename T> class Pal;
class C {
//c是一个普通的非模板类
friend class Pal<C>;//用类C实例化的Pal是C的一个友元
//Pal2的所有实例都是C的友元;这种情况无需前置声明
template<typename X> friend class Pal2;
};
template<typename T>
class C2 {
//C2的每个实例将相同实例化的Pal声明为友元
friend class Pal<T>;//Pal的模板声明必须在作用域之内
//Pal2的所有实例都是C2的每个实例的友元,不需要前置声明
template<typename X> friend class Pal2;
//Pal3是一个非模板类,它是C2所有实例的友元
friend class Pal3;//不需要Pal3的前置声明
};
//令模板自己的类型参数成为友元
template<typename Type>
class Bar {
friend Type;//将访问权限授予用来实例化Bar的类型
};