类模板遇上友元函数
当类模板遇上友元函数的时候有些规矩与我们的常规想法不一样。
看一下下面的代码
#include<iostream> using namespace std; template<class T> class Complex { public: Complex(T r = 0, T i = 0); Complex(T a) { Real = a; Image = 0; } void print() const; friend Complex<T> operator+ (const Complex<T> & c1, const Complex<T> & c2); //{ // T r = c1.Real + c2.Real; // T i = c1.Image + c2.Image; // return Complex<T>(r, i); //} friend Complex<T> operator- (const Complex<T> & c1, const Complex<T> & c2) { T r = c1.Real - c2.Real; T i = c1.Image - c2.Image; return Complex<T>(r, i); } friend Complex<T> operator- (const Complex<T> & c) { return Complex<T>(-c.Real, -c.Image); } private: T Real, Image; }; template<class T> Complex<T>::Complex(T r, T i) { Real = r; Image = i; } template<class T> void Complex<T>::print()const { cout << '(' << Real << " , " << Image << ')' << endl; } template<class T> //注意这里有非法不可见字符 Complex<T> operator+ (const Complex<T>& c1, const Complex<T> & c2 ) { T r = c1.Real + c2.Real ; T i = c1.Image+c2.Image ; return Complex<T>( r, i ) ; } void main() { Complex<double> c1(2.5, 3.7), c2(4.2, 6.5); Complex<double> c; c = c1 + c2; c.print(); c = c2 + c2; c.print(); c = -c1; c.print(); system("pause"); }
编译居然不通过
错误 1 error LNK2019: 无法解析的外部符号 "class Complex<double> __cdecl operator+(class Complex<double> const &,class Complex<double> const &)" (??H@YA?AV?$Complex@N@@ABV0@0@Z),该符号在函数 _main 中被引用 C:\Users\Administrator\Documents\Visual Studio 2013\Projects\博客\类模板遇上友元函数\类模板遇上友元函数\mainwin.obj 类模板遇上友元函数
发现重载加法运算符出错,而重载减法运算符居然没出错。。。这是怎么回事。。。
因为类模板遇上友元函数的时候,要将友元函数的函数体写在类里面。。。。当然这不是必须的。。。但却是一种行业经验。

浙公网安备 33010602011771号