首先,已声明好的类Triangle
file://Triangle.htemplateclass Triangle{ public: Triangle(T width,T height);private: T width; T height;};
再在Triangle.hpp内补全构造函数
file://Triangle.hpptemplateTriangle ::Triangle(T width,T height){ this->width=width; this->height=height;}
------------------------------------------------------------------------
以上为准备工作,接下来才是主要内容
----------------------------------------------------------------------
一.GCC与VC++都可以编译成功的版本
1.友元函数为重载函数
操作流程:
1) 在模板内添加友元函数声明(记住:因为友元函数也是函数模板,所以需要在函数名后加<T>)
file://Triangle.htemplateclass Triangle{ public: Triangle(T width,T height); friend ostream& operator<< (ostream& os,Triangle & t); private: T width; T height;};
2)定义友元函数
file://Triangle.hpptemplate//这个T可以为其他代号 因为这是一个崭新的函数模板ostream& operator<<(ostream& os,Triangle & t){ os<<"高度为"< <<"宽度为"<
2.普通友元函数
操作流程一共三步,第一步是在类模板定义前声明类模板和友元函数的函数模板,接下来两部与友元重载函数的两部一致
1)声明类模板和友元函数的函数模板+2)类模板内部声明友元函数
file://Triangle.htemplateclass Triangle;template void showSize(Triangle & t);template class Triangle{public: Triangle(T width,T height); friend void showSize (Triangle & t);private: T width; T height;};
3)定义友元函数的函数模板
file://Triangle.hpptemplatevoid showSize(Triangle & t){ cout<<"the size of triangle is "<
总结:
重载函数与一般友元函数的写法区别:如果是模板类中的普通友元函数,那需要在模板类定义前声明一下模板类以及模板函数,如果是重载函数则不需要。
二.只有VC++编译器可以编译成功的版本
如果你使用的是VS这种IDE,那么不用管是一般友元函数还是重载函数 ,写法都一样
1)现在模板类中声明友元函数
file://Triangle.htemplateclass Triangle{public: Triangle(T width,T height); template friend ostream& operator<<(ostream& os,Triangle & t); template friend void showSize(Triangle & t);private: T width; T height;};
2)定义(定义与 一. 中一致,这里就不写了)
整体总结,
一,优点:多种c++编译器都可以编译成功。缺点,一般友元函数写法与友元重载函数写法不同
二,优点:友元函数写法就一种。缺点,只可以在vs上的vc++编译器编译成功。
我个人建议还是使用一。