• <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)  編輯 收藏 引用
            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品久久久久久无码人妻热 | 伊人久久大香线蕉av一区| 国产精品青草久久久久福利99| 国产精品久久久久久久久鸭| 久久国产精品免费一区二区三区| 精品久久久久中文字幕一区| 久久久久久国产a免费观看黄色大片 | 亚洲精品无码久久千人斩| 日产精品久久久一区二区| 久久精品国产精品亚洲精品| 久久久久久无码国产精品中文字幕| 亚洲色欲久久久久综合网| 久久久久99精品成人片直播| 久久婷婷色综合一区二区| 午夜精品久久久久久久| 久久午夜综合久久| AV狠狠色丁香婷婷综合久久| 久久久受www免费人成| 91精品国产91久久久久福利| 日本欧美国产精品第一页久久| 91精品国产91久久久久福利| 国产精品成人久久久| 青青青青久久精品国产h| 99久久精品免费看国产一区二区三区| 久久99热狠狠色精品一区| 久久久国产打桩机| 中文成人久久久久影院免费观看| 精品久久久久久综合日本| 久久久久久久久无码精品亚洲日韩| 久久性生大片免费观看性| 久久精品国产只有精品2020| 久久天天躁夜夜躁狠狠躁2022| 久久久人妻精品无码一区| 激情综合色综合久久综合| 久久青青草原综合伊人| 国产精品久久午夜夜伦鲁鲁| 人妻无码久久一区二区三区免费| 欧美黑人激情性久久| 7777久久久国产精品消防器材 | 亚洲日韩中文无码久久| 久久久久亚洲AV无码专区桃色|