类模板与友元函数:友元函数在类外实现的举例
//============================================================================
// Name : test.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
template<typename T>
class Complex;
template<typename T>
Complex<T>mySub(Complex<T>& a,Complex<T>& b);**//1.友元函数必须提前声明,不然无法编译**
template<typename T>
ostream & operator<< (ostream &out ,Complex<T> & c);//2.友元函数必须提前说明,不然无法编译
template <typename T>
class Complex{
friend ostream & operator<< <T>(ostream &out ,Complex<T> & c);//3.为友元函数时要标明<T>,不然该函
friend Complex<T>mySub<T>(Complex<T>&a,Complex <T>&b);//数不是模板函数了。
public:
Complex(T a,T b)//**4.不是友元函数,不需要提前声明。可以在类内部实现。**
{
this->a = a;
this->b = b;
}
Complex operator+ (const Complex &obj);//**5.不是友元函数,不需要提前声明。可以在类外部实现。**
private:
T a;
T b;
};
/*
template<typename T>
Complex<T>::Complex(T a,T b)//6.这与注释4是同一个函数只是实现的位置不同而已。
{
this->a = a;
this->b = b;
}*/
template<typename T>
Complex<T> Complex<T>::operator+ (const Complex & obj)
{
Complex tmp(a + obj.a,b + obj.b);
return tmp;
}
template <typename T>
ostream & operator<< (ostream &out,Complex<T>&c)//7.此处的定义函数要与1注释的的函数声明一致没有3处的红色
{ //<T>。
if(c.b>0){
out << c.a <<"+"<<c.b<<"i";
}else if(c.b == 0)
{
out << c.a;
}else if(c.a == 0)
{
out<<c.b<<"i";
}else
{
out <<c.a<<c.b<<"i";
}
return out;
}
template <typename T>
Complex<T> mySub (Complex<T>&a,Complex<T>&b)//**8.该处的函数定义与2处的函数声明要保持一致,没有3处的红色<T>**
{
Complex<T>tmp(a.a-b.a,a.b-b.b);
return tmp;
}
int main() {
Complex<int> k(1,2);
Complex<int> t(3,4);
cout<<endl;
Complex<int>c =k + t;
cout<<k<<std::endl;
cout<<t<<std::endl;
cout<<c<<std::endl;
Complex<int>d = mySub(k,t);
cout<<d<<std::endl;
return 0;
}
结果:1+2i
3+4i
4+6i
-2-2i
总结:加粗的地方都是需要注意的点。