• <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>

            5D空間

            學習總結與經驗交流

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            摘要:二重模板有什么用,什么情況下使用二重模板,對二重模板進行的某種特化進行重載,=以及拷貝構造函數在二重模板中的注意事項
              
              小記1是因為這個話題很可能還有其他小記。
              在模板下定義一個類,類的方法包括重載的運算符往往可以處理這個類模板對于相同類型參數的特化的對象。但是有時候我們往往希望一個類模板的特化對象的方法還可以處理這個類模板其他特化的對象。一種辦法是利用類的性質定義轉換構造函數(convert constructor ),但是我們可以使用模板得到一種更通用的方法,那就是在類模板中定義二重模板。
              定義方法很簡單,下面的例子會展示。注意內層模板的參數應該與外層模板不一樣,而且定義的時候應該使用兩層template。
              對于一般的函數和運算符,通常來說,如果只定義一個二重模板的方法,它既可以處理不同類型的特化對象,也可以處理相同類型的特化對象(即T和C是相同類型)。如果在外層模板中另外定義了一個普通的同名方法(以處理相同類型的特化對象),那么在處理相同類型的特化對象時,則會調用這一套方法。這有點像對模板特化進行重載(告訴編譯器在特殊情況,這里是特化類型相同,應該使用另外一套方法)。
            例如:
            如果把8行和14~18行注釋掉,那么輸出結果均為兩行 接受不同類型。
             1#include <iostream>
             2using namespace std;
             3
             4template < typename T >
             5class A
             6{
             7public:
             8    void function( const A< T > & );
             9
            10    template < typename C >
            11    void function( const A< C > & );
            12}
            ;
            13
            14template < typename T >
            15void A< T >::function( const A< T > & )
            16{
            17    cout << "接受相同類型" << endl;
            18}

            19
            20template < typename T >
            21template < typename C >
            22void A< T >::function( const A< C > & )
            23{
            24    cout << "接受不相同類型" << endl;
            25}

            26
            27int main()
            28{
            29    A< int > a;
            30    A< int > b;
            31    A< double > c;
            32
            33    a.function( b );
            34    a.function( c );
            35}

              但是對于復制操作符和拷貝構造函數來說,情況有些不一樣。因為編譯器會為沒有定義的類提供默認=以及拷貝構造函數,根據上面的分析,這個默認的東西相當于對二重模板中特殊情況的重載,所以如果只有一個二重模板,那么它將不能處理相同類型的類模板特化的對象。而這時,程序會調用編譯器提供的默認=以及拷貝構造函數,而這往往是我們不想要的(我們需要自己定制的=以及拷貝構造函數啊)。所以這時,我們需要自己定制一套非二重模板的=或者拷貝構造函數來滿足需求。

            例如:
            如果把8行和14~18行注釋掉,那么輸出結果只有一行 為不同類型調用=號 ,因為另外一句話調用了編譯器提供的默認=號,所以并沒有任何輸出。
             1#include <iostream>
             2using namespace std;
             3
             4template < typename T >
             5class B
             6{
             7public:
             8    void operator=const B< T > & );
             9
            10    template < typename C >
            11    void operator=const B< C > & );
            12}
            ;
            13
            14template < typename T >
            15void B< T >::operator=const B< T > & )
            16{
            17    cout << "為相同類型調用=號" << endl;
            18}

            19
            20template < typename T >
            21template < typename C >
            22void B< T >::operator=const B< C > & )
            23{
            24    cout << "為不同類型調用=號" << endl;
            25}

            26
            27int main()
            28{
            29    B< int > a;
            30    B< int > b;
            31    B< double > c;
            32
            33    a = b;
            34    a = c;
            35}
            posted on 2011-04-05 13:50 今晚打老虎 閱讀(1315) 評論(0)  編輯 收藏 引用 所屬分類: 學習筆記
            狠狠色伊人久久精品综合网 | 国产精品成人99久久久久91gav| 午夜精品久久久久久中宇| 久久国产精品成人影院| 四虎国产永久免费久久| 久久婷婷人人澡人人爽人人爱| 国产精品久久久久久久久鸭| 青青草国产97免久久费观看| 色综合久久无码中文字幕| 国内精品久久久久国产盗摄| 亚洲国产精品18久久久久久| 久久无码一区二区三区少妇| 久久国产欧美日韩精品| 亚洲日本va午夜中文字幕久久| 久久久久久无码Av成人影院| 亚洲综合久久夜AV | 国产999精品久久久久久| 精品久久亚洲中文无码| 久久精品国产亚洲av瑜伽| 久久不见久久见免费视频7| 午夜精品久久影院蜜桃| 99久久综合国产精品二区| 精品国产乱码久久久久久郑州公司 | 狠狠色丁香久久婷婷综合_中| 久久综合九色综合久99| 99久久精品免费看国产一区二区三区 | 亚洲AⅤ优女AV综合久久久| 精品久久久久中文字幕日本| 久久婷婷五月综合国产尤物app| 国产精品久久精品| 国产91色综合久久免费| 久久丫精品国产亚洲av不卡| 狠狠综合久久AV一区二区三区| 看全色黄大色大片免费久久久| 精品久久久久久99人妻| 久久久久久国产精品无码下载 | 四虎国产精品成人免费久久| 久久久久女教师免费一区| 国产精品久久久久一区二区三区| 久久九九全国免费| 久久99热狠狠色精品一区|