模板類的幾點注意

最近剛學了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)操作符重載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,698評論 1 51
  • C++運算符重載-上篇 本章內(nèi)容:1. 運算符重載的概述2. 重載算術(shù)運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 2,392評論 0 51
  • 重新系統(tǒng)學習下C++;但是還是少了好多知識點;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme閱讀 20,468評論 0 50
  • 快考試了,題沒刷完,且趕上出差。自我安慰一番,帶上書和題,高鐵上的5個小時可以好好利用起來。雖然出差,可晚上比較空...
    靜靜安靜的爐閱讀 198評論 0 0
  • 有時我不知道該如何評價你。說你不懂事吧,有時又挺懂事的,說你懂事吧卻又常常把我氣個半死。 為什么你和我小時候一點都...
    花開暖暖吖閱讀 465評論 3 0

友情鏈接更多精彩內(nèi)容