C++类模板与友元函数的类内和类外实现-E0020报错(五)

这里有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;

告诉编译器我们的类是存在的。

那么友元函数在类外实现的时候。

也就能解决问题了。

发布了68 篇原创文章 · 获赞 141 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/cfl997/article/details/103152746