类模板遇上友元函数

当类模板遇上友元函数的时候有些规矩与我们的常规想法不一样。

看一下下面的代码

#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 类模板遇上友元函数

 

发现重载加法运算符出错,而重载减法运算符居然没出错。。。这是怎么回事。。。

因为类模板遇上友元函数的时候,要将友元函数的函数体写在类里面。。。。当然这不是必须的。。。但却是一种行业经验。

 

posted @ 2016-11-15 17:37  ren_zhg1992  阅读(211)  评论(0)    收藏  举报