• <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年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            相冊(cè)

            C++語(yǔ)言

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            轉(zhuǎn)載自:http://dev.csdn.net/article/3/3354.shtm
             

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

            在SGI*STL源代碼里, typename這個(gè)新的C++關(guān)鍵字得使用可以說(shuō)是隨處可見(jiàn). 很多以前學(xué)習(xí)過(guò)
            C++的人可能還不認(rèn)識(shí)typename, 其實(shí)它的常規(guī)用法很簡(jiǎn)單: 在聲明模板函數(shù)或者模板類(lèi)時(shí),
            傳統(tǒng)的寫(xiě)法:
            template <class T>
            generic_function() {
            //........
            }

            亦可以寫(xiě)成
            template <typename T>
                     ------------
            generic_func() {
            //...............
            }
            引入這個(gè)關(guān)鍵字主要是為了避免class可能給人帶來(lái)的混淆.
            本來(lái)typename的用法就是這么簡(jiǎn)單, 但是STL源代碼中還有typename的一種不常見(jiàn)的用法, 如果
            不了解, 閱讀源代碼時(shí)就會(huì)遇到困難. 因?yàn)槟壳拔艺也坏接嘘P(guān)這個(gè)問(wèn)題的說(shuō)明, 所以自己試驗(yàn)了
            一下, 得到一個(gè)猜測(cè), 現(xiàn)簡(jiǎn)介如下, 請(qǐng)有識(shí)之士斧正.

            首先看一段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:  }

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

            解釋:
                我認(rèn)為typename的語(yǔ)義是: 通知編譯器, 在typename后面被聲明的東西是一個(gè)類(lèi)型, 而不是別的
            什么東西.

             

             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>   // 用一個(gè)模板類(lèi)作為模板參數(shù), 這是很常見(jiàn)的
            14struct CTwo {
            15    // 請(qǐng)注意以下兩行
            16    // typedef COne::one_value_type  two_value_type;   // *1
            17    typedef typename COne::one_value_type  two_value_type;      // *2  
            18}
            ;
            19
            20// 以上兩個(gè)模板類(lèi)只是定義了兩個(gè)內(nèi)部的public類(lèi)型, 但請(qǐng)注意第二個(gè)類(lèi)CTwo的two_value_type類(lèi)型
            21// 依賴(lài)COne的one_value_type, 而后者又取決于COne模板類(lèi)實(shí)例化時(shí)傳入的參數(shù)類(lèi)型.
            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編譯通過(guò), 結(jié)果打印"Right". 但是如果把*1行的注釋號(hào)去掉, 注釋
            *2行, 則編譯時(shí)報(bào)錯(cuò), 編譯器不知道COne::one_value_type為何物. 通常在模板類(lèi)參數(shù)中的類(lèi)型到
            實(shí)例化之后才會(huì)顯露真身, 但這個(gè)CTwo類(lèi)偏偏又要依賴(lài)一個(gè)已經(jīng)存在的COne模板類(lèi), 希望能夠預(yù)先
            保證CTwo::two_value_type與COne::one_value屬于同一類(lèi)型, 這是就只好請(qǐng)typename出山, 告訴
            編譯器, 后面的COne::one_value_type是一個(gè)已經(jīng)存在于某處的類(lèi)型的名字(type name), 這樣編譯
            器就可以順利的工作了.

            posted on 2008-06-24 21:56 楊彬彬 閱讀(220) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++語(yǔ)言
            国产ww久久久久久久久久| 久久久久久久久久久久久久| 久久久久亚洲av无码专区喷水| 狠狠色丁香久久婷婷综| 亚洲国产精品一区二区三区久久 | 国产毛片久久久久久国产毛片 | 久久精品国产一区| 精品久久久无码中文字幕| 无码精品久久久久久人妻中字| 91精品国产91久久久久久青草| 久久综合噜噜激激的五月天| 亚洲国产成人乱码精品女人久久久不卡 | 久久亚洲精品国产亚洲老地址| 久久久久久综合一区中文字幕| 亚洲国产另类久久久精品小说| 一本一道久久精品综合| 久久无码高潮喷水| 久久天天婷婷五月俺也去| 久久精品视频网| 无码人妻久久一区二区三区免费| 久久99精品久久久久久不卡| 久久精品亚洲日本波多野结衣 | 天堂久久天堂AV色综合| 色偷偷91久久综合噜噜噜噜| 99久久综合国产精品二区| 亚洲中文精品久久久久久不卡| 日日躁夜夜躁狠狠久久AV| 久久综合日本熟妇| 精品一二三区久久aaa片| 国内精品久久久久国产盗摄| 久久这里只有精品久久| 久久久噜噜噜久久中文福利| 国内精品九九久久精品| 免费精品久久久久久中文字幕| 国产高清美女一级a毛片久久w| 狠狠色婷婷综合天天久久丁香| 精品少妇人妻av无码久久| 国产成人香蕉久久久久| 久久香蕉一级毛片| 久久精品国产第一区二区| 久久久噜噜噜久久中文字幕色伊伊 |