• <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 閱讀(552) 評論(0)  編輯 收藏 引用
            <2009年5月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产精品99精品国产987| 国产一区二区三精品久久久无广告| 久久久中文字幕日本| 久久久久99精品成人片| 久久久久久久女国产乱让韩| 久久精品国产亚洲av麻豆小说| 99久久国产亚洲高清观看2024 | 久久嫩草影院免费看夜色| 久久亚洲国产精品五月天婷| 亚洲AV无码久久精品色欲| 日本三级久久网| 久久久久亚洲av无码专区导航| 精品久久久无码中文字幕天天 | 久久国产色AV免费看| 久久精品国产只有精品66| 国内精品久久久久久99| 中文成人无码精品久久久不卡 | 亚洲国产小视频精品久久久三级 | 久久精品国产WWW456C0M| 伊人久久大香线蕉av一区| 精品久久综合1区2区3区激情| 无遮挡粉嫩小泬久久久久久久| 看全色黄大色大片免费久久久| 狠狠色丁香婷婷久久综合不卡 | 久久综合88熟人妻| 要久久爱在线免费观看| 久久久久亚洲AV无码专区桃色| 久久免费精品一区二区| 99国产欧美久久久精品蜜芽| 亚洲AV无码1区2区久久| 伊人久久大香线蕉综合网站| 久久九九久精品国产免费直播| 亚洲精品国产成人99久久| 久久精品中文字幕无码绿巨人| 久久精品国产日本波多野结衣 | 国产韩国精品一区二区三区久久| 99久久国产亚洲综合精品| 中文字幕精品无码久久久久久3D日动漫| 久久精品亚洲乱码伦伦中文| 久久精品无码专区免费| 欧美日韩精品久久久免费观看|