c++中友元的一些总结(4)
4,友元模板 如果想定义一系列函数为该类的友元,可以使用友元模板。它和模板的申明式类似,只是在template<>后加了friend关键字。 class A { public: template friend void foo(); }; 5,能否做为定义式 能做为定义式的情况是:非受限,没有前至::,没有模板参数列表,没一对尖括号。如果是模板申明式,不能是首次申明,在该处必须是可见的。 6,一个完整的例子 template class Rat { public: Rat(T _a, T _b) : a(_a), b(_b) {} friend Rat private: T a,b; }; template Rat { return Rat } Rat< T >为T类型的有理数类,定义它的相乘运算,定义一个全局函数,并申明为友元,该函数也应该是模板,希望有如上的程序通过编译。在friend式之前没有operator*()的申明,所以这里不能是首次申明,在前面必须加上申明式: template Rat 在这之前又没有Rat的申明,再加上: template class Rat; 通过编译,或者改成友元模板: template class Rat { public: Rat(T _a, T _b) : a(_a), b(_b) {} template friend Rat private: T a,b; }; template Rat { return Rat } 有细微的不同,Rat< T >申明了一系列友元operator*< UU >,当然没必要,只要 operator*< T >就够了,但是形式上简单一些。还有一种更简单的形式,就是将定义式放在里面,正是Effective C++里使用的方法: template class Rat { public: Rat(T _a, T _b) : a(_a), b(_b) {} friend Rat { return Rat } private: T a,b; }; 相关资料 |