对于模板的友元一般分为三种:
1.非模板友元
2.约束模板函数
3.非约束模板函数
例子如下所示
//class_friend.h
#ifndef CLASS_FRIEND_H
#define CLASS_FRIEND_H
/*非模板友元*/
#include<iostream>
using namespace std;
template<typename U> void cnt();/***********1.约束模板友元函数先声明********************/
template<typename U>void show_object(U &);
template<typename T>
class AC
{
private:
T data;
static int count;
public:
AC(){}
AC(const T &d) :data(d){ ++count; }
~AC(){ --count; }
/*非模板友元函数*/
friend void get_count();//所有模板实例化的友元
friend void show(AC<T>&object);//不是模板函数,只是将模板作为参数,必须显式具体化定义
/*约束模板友元函数*/
friend void cnt<T>();/*2.声明为模板友元*/
friend void show_object</*AC<T>*/>(AC<T> &ac);
/*非约束模板友元函数*/
template<typename T1, typename T2>friend void show_(T1 &t1, T2 &t2);
};
template<typename T>
int AC<T>::count = 0;
void get_count()
{
cout << "int count: " << AC<int>::count << "; ";
cout << "double count: " << AC<double>::count << endl;
}
/*必须显示具体化相应的类型*/
void show(AC<int> &object)
{
cout << "AC<int>: " << object.data << endl;
}
void show(AC<double> &object)
{
cout << "AC<double>: " << object.data << endl;
}
/*3.为约束模板友元定义*/
template<typename U>
void cnt()
{
cout << "template size: " << sizeof(AC<U>) << "; ";
cout << "template count<U>(): " << AC<U>::count << endl;
}
template<typename U>
void show_object(U &ac)//注意不可写成void show_object<>(AC<U> &ac),与模板声明处相一致
{
cout << "data: " << ac.data << endl;
}
/*非约束模板友元函数定义*/
template<typename T1, typename T2>
void show_(T1 &t1, T2 &t2)
{
cout << "T1.data: " << t1.data << ",T2.data: " << t2.data << endl;
}
#endif //CLASS_FRIEND_H
//main.cpp
#include<iostream>
//#include<cstdlib>
#include"windows.h"
#include"class_friend.h"
using namespace std;
int main()
{
cout << "************非模板友元测试************\n";
AC<int>obj1(10);
get_count();//非模板友元函数
AC<double>obj2(12.0);
get_count();
show(obj1);//非模板友元函数
show(obj2);
cout << "************约束模板友元测试**********\n";
AC<int>obj3(5);
AC<double>obj4(8.0);
cout << "show_object(obj3): ";
show_object(obj3);
cout << "show_object(obj4): ";
show_object(obj4);
cout << "cnt<int>(): ";
cnt<int>();
cout << "cnt<double>(): ";
cnt<double>();//注意调用格式
cout << "************非约束模板友元测试********\n";
cout << "show_(obj3, obj4): ";
show_(obj3, obj4);
cout << "Done!" << endl;
system("pause");
return 0;
}
程序运行结果如下