01 函数、类、类的成员函数作为类模板的友元
代码例子如下:

// 普通函数
void Func1() { }

// 普通类
class A { };

// 普通类
class B
{
public:
void Func() { } // 成员函数
};

// 类模板
template <class T>
class Tmp
{
friend void Func1(); // 友元函数
friend class A; // 友元类
friend void B::Func(); // 友元类的成员函数
}; // 任何从 Tmp 实例化来的类 ,都有以上三个友元

02 函数模板作为类模板的友元

// 类模板
template <class T1,class T2>
class Pair
{
private:
T1 key; //关键字
T2 value; //值
public:
Pair(T1 k,T2 v):key(k),value(v) { };

// 友元函数模板
template <class T3,class T4>
friend ostream & operator<< (ostream & o, const Pair<T3,T4> & p);
};

// 函数模板
template <class T3,class T4>
ostream & operator<< (ostream & o, const Pair<T3,T4> & p)
{
o << "(" << p.key << "," << p.value << ")" ;
return o;
}

int main()
{
Pair<string,int> student("Tom",29);
Pair<int,double> obj(12,3.14);

cout << student << " " << obj;
return 0;
}

输出结果:

(Tom,29) (12,3.14)

03 函数模板作为类的友元

// 普通类
class A
{
private:
int v;
public:
A(int n):v(n) { }

template <class T>
friend void Print(const T & p); // 函数模板
};

// 函数模板
template <class T>
void Print(const T & p)
{
cout << p.v;
}

int main()
{
A a(4);
Print(a);
return 0;
}

输出结果:

4

04 类模板作为类模板的友元

// 类模板
template <class T>
class B
{
private:
T v;
public:
B(T n):v(n) { }

template <class T2>
friend class A; // 友元类模板
};

// 类模板
template <class T>
class A
{
public:
void Func( )
{
B<int> o(10); // 实例化B模板类
cout << o.v << endl;
}
};

int main()
{
A<double> a;
a.Func ();
return 0;
}

输出结果:

10