类模板可以定义友元函数以及进行运算符重载,下面给出友元函数实现以及操作符重载
#include<iostream>
using namespace std;
template<class T>
class myclass
{
T x;
T y;
public:
myclass(T t1=NULL,T t2=NULL) :x(t1),y(t2)
{
}
template<class T1>
friend void print(const myclass<T1> &my);//加上特化处理,重载需添加template<class T1>,否则无法运行
template<class T2>
friend myclass<T2> operator +(const myclass<T2> &my1, const myclass<T2> &my2);
};
template<class T1>
void print(const myclass<T1> &my)
{
std::cout << my.x << "myclass" << my.y << std::endl;
}
template<class T2>
myclass<T2> operator +(const myclass<T2> &my1, const myclass<T2> &my2)
{
myclass<T2> a;
a.x = my1.x + my2.x;
a.y = my1.y + my2.y;
return a;
}
void main()
{
myclass<int> a,b(10,20),c(20,10);
a = b + c;
print(a);
std::cin.get();
}
也可以在类定义的前面声明每个模板函数:
#include<iostream>
using namespace std;
template<class T1>
friend void print(const myclass<T1> &my);
template<class T>
class myclass;
template<class T>
class myclass
{
T x;
T y;
public:
myclass(T t1=NULL,T t2=NULL) :x(t1),y(t2)
{
}
friend void print<>(const myclass<T1> &my);//加上特化处理
};
template<class T1>
void print(const myclass<T1> &my)
{
std::cout << my.x << "myclass" << my.y << std::endl;
}
同样可以执行。