当类模板中有友元函数,且友元函数在类外实现,那么,程序编译时会出现:无法解析的外部符号的错误。
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);
这样改的原因是,类模板需要二次编译,在出现模板的地方编译一次,在调用模板的地方会再次编译。
