类模板的类外实现与hpp文件

xiaoxiao2021-02-27  198

当类模板中有友元函数,且友元函数在类外实现,那么,程序编译时会出现:无法解析的外部符号的错误。

template<class T> class Dad { public: T Dproperty; Dad(T property); //友元函数 friend ostream& operator<<(ostream& os, Dad<T>& dad); void commonfun();//普通函数 }; template<class T> Dad<T>::Dad(T property) { Dproperty = property; } template<class T> ostream& operator<<(ostream& os, Dad<T>& dad) { os << dad.Dproperty << endl; return os; } template<class T> void Dad<T>::commonfun() { cout << "commonfun" << endl; } void test() { Dad<int> dad(5); dad.commonfun();//正常调用 cout << dad;//错误,无法解析的外部符号 }

解决方法是把.cpp文件改为.hpp文件(将类模板的声明和实现放到一个文件中,并把这个文件的扩展名改为.hpp,这是个约定的规则,必须这样写。),并在operator<<函数再定义一个模板类型,代码更改为:

template<class T1>

friend ostream& operator<<(ostream& os, Dad<T1>& dad);

这样改的原因是,类模板需要二次编译,在出现模板的地方编译一次,在调用模板的地方会再次编译。

转载请注明原文地址: https://www.6miu.com/read-11300.html

最新回复(0)