• <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>
            隨筆 - 8  文章 - 26  trackbacks - 0
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章分類

            文章檔案

            相冊

            C++語言

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            轉載自:http://dev.csdn.net/article/3/3354.shtm
             

            /*******************************************************************************
             *  SGI*STL是STL之父Alexander Stepanov和STL巨匠Matt Austern等人的作品, 是當今  *
             *  最富盛名、最出色的STL實現版本,全部源代碼和說明文檔可從www.sgi.com/STL/下  *
             *  載, 是我們學習STL的最佳范本. 但是眾所周知, STL使用了大量復雜艱深的C++特性, *
             *  加上STL本身的復雜和龐大, 使得閱讀代碼本身就成為一件非常困難的工作. 以下文  *
             *  字是我在學習STL過程中得到的一些經驗和猜測, 希望能對大家有所幫助, 更希望能  *
             *  得到大家的批評和指正, 以利于我們的共同提高.                                *
             *                                                                      myan   *
             *******************************************************************************/

            在SGI*STL源代碼里, typename這個新的C++關鍵字得使用可以說是隨處可見. 很多以前學習過
            C++的人可能還不認識typename, 其實它的常規用法很簡單: 在聲明模板函數或者模板類時,
            傳統的寫法:
            template <class T>
            generic_function() {
            //........
            }

            亦可以寫成
            template <typename T>
                     ------------
            generic_func() {
            //...............
            }
            引入這個關鍵字主要是為了避免class可能給人帶來的混淆.
            本來typename的用法就是這么簡單, 但是STL源代碼中還有typename的一種不常見的用法, 如果
            不了解, 閱讀源代碼時就會遇到困難. 因為目前我找不到有關這個問題的說明, 所以自己試驗了
            一下, 得到一個猜測, 現簡介如下, 請有識之士斧正.

            首先看一段SGI*STL源代碼, 摘自stl_iterator.h

            1: template <class _Container, class _Iterator>
            2: inline insert_iterator<_Container> inserter(_Container& __x, _Iterator __i)
            3: {
            4:   typedef typename _Container::iterator __iter;
            5:   return insert_iterator<_Container>(__x, __iter(__i));
            6:  }

            令人費解的部分在第四行. 請大家在看我的解釋之前先想一想, 我不敢保證下面解釋的正確性和
            全面性.

            解釋:
                我認為typename的語義是: 通知編譯器, 在typename后面被聲明的東西是一個類型, 而不是別的
            什么東西.

             

             1例子:
             2// tpname.cpp
             3#include <iostream>
             4#include <typeinfo>  // for typeid() operator
             5
             6using namespace std;
             7
             8template <typename TP>
             9struct COne {   // default member is public
            10    typedef TP one_value_type;
            11}
            ;
            12
            13template <typename COne>   // 用一個模板類作為模板參數, 這是很常見的
            14struct CTwo {
            15    // 請注意以下兩行
            16    // typedef COne::one_value_type  two_value_type;   // *1
            17    typedef typename COne::one_value_type  two_value_type;      // *2  
            18}
            ;
            19
            20// 以上兩個模板類只是定義了兩個內部的public類型, 但請注意第二個類CTwo的two_value_type類型
            21// 依賴COne的one_value_type, 而后者又取決于COne模板類實例化時傳入的參數類型.
            22
            23int main()
            24{
            25    typedef COne<int> OneInt_type;
            26    typedef CTwo< OneInt_type > TwoInt_type;
            27    TwoInt_type::two_value_type i;
            28    int j;
            29    if ( typeid(i) == typeid(j) )   // 如果i是int型變量
            30        cout << "Right!" << endl;   // 打印Right
            31    return;
            32}

            33//  ~tpname.cpp
            34

             

            以上例子在Linux下用G++ 2.91編譯通過, 結果打印"Right". 但是如果把*1行的注釋號去掉, 注釋
            *2行, 則編譯時報錯, 編譯器不知道COne::one_value_type為何物. 通常在模板類參數中的類型到
            實例化之后才會顯露真身, 但這個CTwo類偏偏又要依賴一個已經存在的COne模板類, 希望能夠預先
            保證CTwo::two_value_type與COne::one_value屬于同一類型, 這是就只好請typename出山, 告訴
            編譯器, 后面的COne::one_value_type是一個已經存在于某處的類型的名字(type name), 這樣編譯
            器就可以順利的工作了.

            posted on 2008-06-24 21:56 楊彬彬 閱讀(230) 評論(0)  編輯 收藏 引用 所屬分類: C++語言
            国产精品一久久香蕉国产线看观看| 国产精品女同一区二区久久| 成人免费网站久久久| 国产欧美一区二区久久| 狠狠色综合久久久久尤物| 久久午夜无码鲁丝片秋霞| 久久精品人人做人人爽97| 久久精品免费大片国产大片| 色妞色综合久久夜夜| 欧美国产成人久久精品| 久久国产精品无码HDAV| 亚洲欧洲中文日韩久久AV乱码| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲AV无码1区2区久久| 色8久久人人97超碰香蕉987| 国产精品欧美久久久久无广告| 婷婷五月深深久久精品| 精品久久久久中文字幕一区| 久久精品毛片免费观看| 色青青草原桃花久久综合| 99久久99这里只有免费费精品| 狠狠精品干练久久久无码中文字幕 | 国内精品久久人妻互换| 久久99亚洲综合精品首页| 亚洲精品无码久久一线| 久久久久精品国产亚洲AV无码| 一级A毛片免费观看久久精品| 久久久精品人妻一区二区三区蜜桃| 精品久久久久久久久久中文字幕 | 亚洲va久久久噜噜噜久久天堂| 久久se精品一区二区影院| 99久久精品国产高清一区二区| 超级碰碰碰碰97久久久久| 久久国产精品偷99| 久久精品国产99久久香蕉| 99久久人人爽亚洲精品美女| 999久久久免费国产精品播放| 国产午夜久久影院| 久久久91精品国产一区二区三区| 99国产精品久久| 久久人人爽爽爽人久久久|