#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
/*
1.3.8类模板与友元
掌握类模板配合友元函数的类内和类外实现
全局函数类内实现 - 直接在类内声明友元即可
全局函数类外实现 - 需要提前让编译器知道全局函数的存在
*/
//提前让编译器知道Person类的存在
template<class T1, class T2>
class Person;
// 全局函数 类外实现
template<class T1, class T2>
void show2(Person<T1, T2> p)
{
cout << "name:" << p.name << " age:" << p.age << endl;
}
template<class T1, class T2>
class Person{
// 全局函数 类内实现
friend void show(Person<T1, T2> p)
{
cout << "name:" << p.name << " age:" << p.age << endl;
}
friend void show2<>(Person<T1, T2> p); // 全局函数 类内声明
//加上空模板参数列表,以表示该函数声明是类模板中的一个函数模板的声明,而不是普通函数声明
//如果全局函数是类外实现,需要让编译器提前知道该函数的存在
public:
Person(T1 _name, T2 _age)
{
this->name = _name;
this->age = _age;
}
private:
T1 name;
T2 age;
};
void test(){
Person<string, int> p("tom", 10);
show(p);
show2(p);
//建议采用全局函数做类内实现,用法简单,而且编译器可以直接识别
}
int main(){
test();
system("pause");
return 0;
}
