模板与友元
概述
类模板可以有友元,函数模板可以声明为类的友元。友元与模板分为以下几种情况:
模板与普通的类、函数之间:
- 函数、类、类的成员函数作为类模板的友元
- 函数模板作为类的友元
模板与模板之间
- 类模板作为类模板的友元
- 函数模板作为类模板的友元
1、函数、类、类的成员函数作为类模板的友
void Func1() { }
class A { };
class B
{
public:
void Func() { }
};
template <class T>
class Tmpl
{
friend void Func1();
friend class A;
friend void B::Func();
};
注意:任何从Tmp1实例化来的类, 都有以上三个友元。
4、函数模板作为类的友元
//函数模板作为类模板的友元
template<class T1,class T2>
bool Pair<T1,T2>::operator < ( const Pair<T1,T2> & p) const
{ //"小"的意思就是关键字小
return key < p.key;
}
template <class T1,class T2>
ostream & operator<< (ostream & o,const Pair<T1,T2> & 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)
注意:任意从 template <class T1,class T2>ostream & operator<< (ostream & o,const Pair<T1,T2> & p)
生成的函数,都是任意Pair摸板类的友元。
3、函数模板作为类模板的友元
#include <iostream>
#include <string>
using namespace std;
template <class T1,class T2>
class Pair
{
private:
T1 key; //关键字
T2 value; //值
public:
Pair(T1 k,T2 v):key(k),value(v) { };
bool operator < ( const Pair<T1,T2> & p) const;
template <class T3,class T4>
friend ostream & operator<< ( ostream & o,
const Pair<T3,T4> & p);
};
4、类模板作为类模板的友元
#include <iostream>
using namespace std;
class A
{
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
注意:所有从 template <class T>void Print(const T & p)
生成的函数,都成为 A 的友元但是自己写的函数void Print(int a) { }
不会成为A的友元。