• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0

            在模板類中輸入流“》”和輸出流“《”的重載,若使用友元在類內聲明,在類外實現,那么連接時將會報錯,但我們可以采用以下三種方式來實現輸出流"<<"和"輸入流>>"的重載。

            一、將輸出流"<<"和"輸入流>>"重載的實現寫在類中

            #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)    //輸出流重載聲明及實現
                  {
                       return out<<"data   is   "<<t.data;
                  } //--------------------------------------------
                  friend istream& operator>>(istream& in,Test<T>& t)      //輸入流重載聲明及實現
                  {
                      return in>>t.data;
                  }//---------------------------------------------
               private:  
                  T data;  
            };//-----------------------------------------------------------------      
                  
            int   main()  
            {  
               Test<int> b(3);  
               cout<<b<<'\n';  
               cin>>b;
               cout<<b<<'\n';
               return 0;
            }

            那么輸入輸出流重載為什么不能在類內聲明,類外實現呢??因為模板比較特殊,若果在模板類外實現重載的話:

            template<class T>
            ostream& operator<<(ostream& out,Test<T>& t)
            {
                    return out<<"data   is   "<<t.data;
            } //--------------------------------------------

            上面正好是函數模板的定義,而我們知道操作符重載函數不是類的成員函數,因此此處相當于定義了一個新的函數模板(不同于類中的friend ostream& operator<<(ostream& out,Test<T>& t) )。但若去掉template<class T> ,函數中的參數Test<T>就不知是什么類型,所以不能在模板類內聲明,類外實現操作符重載。

            二、既然類外實現相當于重定義了一個函數模板,那么只要他不使用類的私用成員即可,因此重載的函數模板只有通過類的公有成員函數來實現對類的私有成員的操作,這樣不必在類內聲明它為友元,直接在類外重載即可。

            #include "stdafx.h"
            #include   <iostream>
            using   namespace   std;  
               
            template<class T>  
            class Test  
            {  
               public:  
                  Test(const T& t):data(t){}
                  T GetData()const{return data;}
                  void SetData(T &item){data=item;}
               private:  
                  T data;  
            };//-----------------------------------------------------------------
            template<class T>      
            ostream& operator<<(ostream& out,Test<T>& t)   
            {
                  return out<<"data   is   "<<t.GetData();
            } //--------------------------------------------
            template<class T>
            istream& operator>>(istream& in,Test<T>& t)     
            {
                 T item;
                in>>item;
                t.SetData(item);
                return in;
            }//---------------------------------------------      
            int   main()  
            {  
               Test<int> b(3);  
               cout<<b<<'\n';  
               cin>>b;
               cout<<b<<'\n';
               return 0;
            }  

            三、使用過渡函數

            #include "stdafx.h"
            #include   <iostream>
            using   namespace   std;  
               
            template<class   T>  
            class   Test  
            {  
               public:  
                  Test(const T& t):data(t){}
                  //---------------------------------------------
                  template<class CharT,class CharTraits>  
                  basic_ostream<CharT,CharTraits>& Output(basic_ostream<CharT,CharTraits>& out)const    //輸出流過渡函數
                  {
                        return out<<"data   is   "<<data;
                  } //--------------------------------------------
                  template<class   CharT,class   CharTraits>  
                  basic_istream<CharT,CharTraits>& Input(basic_istream<CharT,CharTraits>& in)    //輸入流過渡函數
                  {
                      return in>>data;
                  }//---------------------------------------------
               private:  
                  T data;  
            };//-----------------------------------------------------------------      
            template<class T,class CharT,class CharTraits>  
            basic_ostream<CharT,CharTraits>& operator<<(basic_ostream<CharT,CharTraits>& out,const Test<T>& t)   //輸出流重載
            {  
                return t.Output(out);  
            }//------------------------------------------------------------------      
            template<class T,class CharT,class CharTraits>  
            basic_istream<CharT,CharTraits>& operator>>(basic_istream<CharT,CharTraits>& in,Test<T>& t)   //輸入流重載
            {  
                return t.Input(in);  
            }//------------------------------------------------------------------      
            int   main()  
            {  
               Test<int>   b(4);  
               cout<<b<<'\n';  
               cin>>b;
               cout<<b<<'\n';
               return 0;
            }

            posted on 2011-02-15 01:04 luis 閱讀(559) 評論(0)  編輯 收藏 引用
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品一区二区影院| 亚洲欧美伊人久久综合一区二区| 91精品国产综合久久香蕉| 四虎亚洲国产成人久久精品| 亚洲精品乱码久久久久久久久久久久 | 久久久久亚洲精品天堂久久久久久 | 久久久久亚洲AV无码永不| 99久久精品久久久久久清纯| 久久久精品人妻一区二区三区蜜桃| 精品人妻久久久久久888| 久久一区二区免费播放| 久久国产精品久久| 久久久久久久波多野结衣高潮 | 久久91精品国产91久久户| 久久久午夜精品| 久久国产精品二国产精品| 国产精品久久久久久久| 人妻无码久久一区二区三区免费 | 亚洲精品无码久久久久去q| 青青草国产97免久久费观看| 亚洲精品高清久久| 国产成人无码久久久精品一| 一本色道久久88—综合亚洲精品| 久久综合伊人77777| 久久久精品人妻无码专区不卡| 久久福利青草精品资源站免费| 久久夜色精品国产噜噜噜亚洲AV| 亚洲日本va中文字幕久久| 无码国内精品久久综合88| 久久亚洲AV无码精品色午夜麻豆| 久久中文精品无码中文字幕| 思思久久99热免费精品6| 伊人久久无码精品中文字幕| 中文精品久久久久人妻| 久久久久久精品久久久久| 热re99久久精品国99热| 久久国产精品成人片免费| 精品午夜久久福利大片| 久久电影网| 婷婷伊人久久大香线蕉AV| 91精品国产综合久久婷婷|