最近剛學了C++的模板類設(shè)計,剛開始上手的時候,總是會有一大堆的bug 擺在那里,確實模板作為多態(tài)實現(xiàn)的一種方式,很多時候需要我們?nèi)ピO(shè)想和顧慮很多方面的事情,一不留神就會造成出錯。而且模板類在編譯的時候并不會有什么問題,模板類只有在具體的模板類具體化之后才會顯現(xiàn)出來。至少對于我來說還是挺頭痛的。
那今天我就記錄一下自己在模板類設(shè)計的時候容易犯的錯誤。
模板類的運算符重載
再用友元函數(shù)重載>>和<<這些運算符的時候千萬不要把函數(shù)定義寫在類定義外面?。?/em>
再用友元函數(shù)重載>>和<<這些運算符的時候千萬不要把函數(shù)定義寫在類定義外面??!
再用友元函數(shù)重載>>和<<這些運算符的時候千萬不要把函數(shù)定義寫在類定義外面??!
重要的事情說三遍。
代碼如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
template<class T>
class Test
{
public:
Test(const T& t):data(t){}
//---------------------------------------------
friend ostream& operator<<(ostream& out,Test<T>& t) //輸出流重載聲明及實現(xiàn)
{
return out<<"data is "<<t.data;
} //--------------------------------------------
friend istream& operator>>(istream& in,Test<T>& t) //輸入流重載聲明及實現(xiàn)
{
return in>>t.data;
}//---------------------------------------------
private:
T data;
};//-----------------------------------------------------------------
int main()
{
Test<int> b(3);
cout<<b<<'\n';
cin>>b;
cout<<b<<'\n';
return 0;
}
那么輸入輸出流重載為什么不能在類內(nèi)聲明,類外實現(xiàn)呢??因為模板比較特殊,若果在模板類外實現(xiàn)重載的話:
template<class T>
ostream& operator<<(ostream& out,Test<T>& t)
{
return out<<"data is "<<t.data;
} //--------------------------------------------
上面正好是函數(shù)模板的定義,而我們知道操作符重載函數(shù)不是類的成員函數(shù),因此此處相當于定義了一個新的函數(shù)模板(不同于類中的friend ostream& operator<<(ostream& out,Test<T>& t) )。但若去掉template<class T> ,函數(shù)中的參數(shù)Test<T>就不知是什么類型,所以不能在模板類內(nèi)聲明,類外實現(xiàn)操作符重載。