模板类与非模板类中将重载操作符函数作为友元函数的区别

来源:互联网 发布:access数据库教程视频 编辑:程序博客网 时间:2024/05/22 15:30

今天编程中遇到的问题,花了一个多小时才找出错因

代码

#include<iostream>using namespace std;template<class T>class A{friend ostream& operator << (ostream& out,const A<T>& m);public:A(T c):a(c){}T a;};template<class T>ostream& operator << (ostream& out,const A<T>& m){out<<m.a<<endl;return out;}int main(){A<int> test(2);cout<<test;return 0;} 
这样声明和定义模板友元函数 编译器会报错!!!

undefined reference to `operator<<(std::ostream&, A<int> const&)'

函数没有被实例化

一个简单是解决方法是把函数声明与定义都放在类体中

#include<iostream>using namespace std;template<class T>class A{friend ostream& operator << (ostream& out,const A<T>& m){out<<m.a<<endl;return out;}public:A(T c):a(c){}T a;};int main(){A<int> test(2);cout<<test;return 0;} 
另一种复杂的解决方式是对模板类和友元函数进行全局声明

#include<iostream>using namespace std;template <class T>class A; template <class T>ostream& operator <<(ostream& out,const A<T>& m);template <class T>class A{friend ostream& operator << <>(ostream& out,const A& m);public:A(int c):a(c){}int a;};template <class T>ostream& operator << (ostream& out,const A<T>& m){out<<m.a<<endl;return out;}int main(){A<int> test(2);cout<<test;return 0;} 

这样能正常运行 输出2

注意在模板类中函数operator << 后添加了<>说明我们需要的是T形参的operator <<

注:<T>其中的T可有可无


在非模板类中的友元函数operator<<

#include<iostream>using namespace std;class A{friend ostream& operator << (ostream& out,const A& m);public:A(int c):a(c){}int a;};ostream& operator << (ostream& out,const A& m){out<<m.a<<endl;return out;}int main(){A test(2);cout<<test;return 0;} 
能正常输出2,因为函数已经实例化

1 0