这里有C++STL——全面总结详细教程(附案例解析)(持续更新中)
全局函数类内实现 - 直接在类内声明友元即可
全局函数类外实现 - 需要提前让编译器知道全局函数的存在
创建Person类
分别从类内和类外显示Person的信息。
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2> class Person;
//类外实现
template<class T1, class T2>
void show02(Person <T1, T2>&p) {
cout <<"类外 "<< "name:" << p.m_Name << " age:" << p.m_Age << endl;
}
template<class T1,class T2>
class Person {
public:
Person(T1 name, T2 age) {
this->m_Name = name;
this->m_Age = age;
}
//类内实现
friend void show01(Person<T1,T2>& p) {
cout << "类内 " << "name:" << p.m_Name << " age:" << p.m_Age << endl;
}
//类内声明
friend void show02<>(Person < T1, T2>& p);
private:
T1 m_Name;
T2 m_Age;
};
//类内测试
void test01() {
Person<string, int> p("Tom", 22);
show01(p);
}
//类外测试
void test02() {
Person<string, int> p("Jerry", 18);
show02(p);
}
int main() {
test01();
test02();
system("pause");
return 0;
}
关于E0020报错:
因为我们需要让编译器提前知道,我们的Person类模板是存在的
不然在调用类外实现的时候,Person是没法指向的。
所以增加一行:
template<class T1, class T2> class Person;
告诉编译器我们的类是存在的。
那么友元函数在类外实现的时候。
也就能解决问题了。