如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
类模板的模板友元函数定义类模板的模板友元函数定义有2种方式:1.将友元模板函数直接定义在类模板中。这种方式比较简单直接。2.将友元模板函数声明在类模板中,定义在类模板之外。这种方式的写法,如果不小心,通常会出现编译没问题,链接时无法解析的错误。以下是一个简单的正确的例子:1#include<iostream>2#include<vector>34template<typenameT>5classNumber;67template<typenameT>8voidprint(constNumber<T>&n);910template<typenameT>11std::ostream&operator<<(std::ostream&os,constNumber<T>&n);1213template<typenameT>14std::istream&operator>>(std::istream&is,Number<T>&n);1516template<typenameT,typenameT2>17voidprintVector(conststd::vector<T2>&vt,constNumber<T>&n);1819template<typenameT>20classNumber{21public:22Number(Tv)23:val(v){}24~Number(){}2526private:27Tval;28public:29friendvoidprint<T>(constNumber<T>&n);30friendstd::ostream&operator<<<T>(std::ostream&os,constNumber<T>&n);31friendstd::istream&operator>><T>(std::istream&is,Number<T>&n);3233friendNumber<T>&operator+=(Number<T>&a,constNumber<T>&b)34{35a.val+=b.val;36returna;37}38template<typenameT2>39friendvoidprintVector<T>(conststd::vector<T2>&vt,constNumber<T>&n);40template<typenameT2>41voidmemFunc(conststd::vector<T2>&vt,constNumber<T>&n);42};4344template<typenameT>45std::ostream&operator<<(std::ostream&os,constNumber<T>&n)46{47os<<n.val<<std::endl;48returnos;49}5051template<typenameT>52std::istream&operator>>(std::istream&is,Number<T>&n)53{54is>>n.val;55returnis;56}5758template<typenameT>59voidprint<T>(constNumber<T>&n)60{61std::cout<<n;62}6364template<typenameT,typenameT2>65voidprintVector(conststd::vector<T2>&vt,constNumber<T>&n)66{67for(unsignedinti=0;i<vt.size();i++)68std::cout<<vt.at(i)<<"";69std::cout<<"=>"<<n;70}7172template<typenameT>73template<typenameT2>74voidNumber<T>::memFunc(conststd::vector<T2>&vt,constNumber<T>&n)75{76for(unsignedinti=0;i<vt.size();i++)77std::cout<<vt.at(i)<<"";78std::cout<<"=>"<<n;79}801)以上代码中,operator+=被定义在类模板内部。其他3个函数先被声明(需提前声明类模板,如果模板函数的参数中含有类模板),然后在类模板中被声明为友元函数,之后被定义在类模板体之外。2)请注意当模板函数被声明为类模板的友元时,在函数名之后必须紧跟模板实参表,用来代表该友元声明指向函数模板的实例。否则友元函数会被解释为一个非模板函