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

            程序讓生活更美好

            半畝方塘 天光云影

              C++博客 ::  :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
              55 隨筆 :: 4 文章 :: 202 評(píng)論 :: 0 Trackbacks

            ?1?//?C2782b.cpp
            ?2?//?compile?with:?/clr
            ?3?generic<typename?T>?void?gf(T,?T)?{?}
            ?4?
            ?5?int?main()?{
            ?6????gf(1,?'c');?//?C2782
            ?7????//?try?the?following?line?instead
            ?8????//?gf<int>(1,?'c');
            ?9?}
            10?

            模板中實(shí)參的演繹


            可以先看看下面一段使用模板的代碼:

            ?1 template? < typename?T >
            ?2 ?inline?T? const & ?max(T? const & ?a,T? const & ?b) {
            ?3 ???????????? return ?a < b ? b:a;
            ?4 ????????????}

            ?5
            ?6 #include? < iostream >
            ?7 #include? < string >
            ?8 using ? namespace ?std;
            ?9 int ?main() {
            10 ???? // -------------------正確---------
            11 ???? int ?i = 42 ;
            12 ????cout << " Max(7,i) " << ::max( 7 ,i) << endl;
            13
            14 ???? double ?f1 = 3.4 ;
            15 ???? double ?f2 =- 6.7 ;
            16 ????cout << " Max(f1,f2): " << ::max(f1,f2) << endl;
            17
            18 ???? string ?s1 = " abcd " ;
            19 ???? string ?s2 = " bacd " ;
            20 ????cout << " max(s1,s2): " << ::max(s1,s2) << endl;
            21
            22 ???? // -------------------有問題--------
            23 ????cout << ::max( 1 , 1.2 ) << endl;? // 這句會(huì)出錯(cuò)
            24 ????}

            25

            VC2005 EE編譯的時(shí)候,出現(xiàn)錯(cuò)誤,錯(cuò)誤碼是C2782,可以在附帶的幫助中

            查看這個(gè)錯(cuò)誤碼。

            ? 可以看到錯(cuò)誤信息是:

            ? ? Error Message

            'declaration' : template parameter 'identifier' is ambiguous

            The compiler cannot determine the type of a template argument.

            ?

            ???這意思是說申明的模板參數(shù)標(biāo)識(shí)符是有二義性的,編譯器無法決定模板參數(shù)的類型。

            ???順便附帶上幫助中給的例子如下:

            ?1?//?C2782.cpp
            ?2?template<typename?T>
            ?3?void?f(T,?T)?{}
            ?4?
            ?5?int?main()?{
            ?6?f(1,?'c');???//?C2782
            ?7?//?try?the?following?line?instead
            ?8?//?f<int>(1,?'c');
            ?9?}
            10?


            解決方法:
            ?

            出現(xiàn)2782錯(cuò)誤的,那么我們?cè)趺唇鉀Q呢?

            可以用下面三種方法,

            方法一:對(duì)實(shí)參進(jìn)行強(qiáng)制類型轉(zhuǎn)換,讓他們可以互相匹配

            1max(static_cast<double>(1),1.2)

            方法二:顯示的指出T的類型

            max<double>(1,1.2)

            方法三:可以指定兩個(gè)參數(shù)可以具有不同的類型

            那么上面的模板例子可以改寫成下面這樣的

            1template?<typename?T1,typename?T2,>
            2?inline?T1?max(T1?const&?a,T2?const&?b){
            3????????????????return?a<b?b:a;
            4????????????????}

            5

            上面這樣定義模板,就可以傳遞不同的參數(shù),但是這樣做就必須要定義好返回類型,就是上面的T1,這是此方法的缺點(diǎn)。除此之外,因?yàn)閮蓚€(gè)參數(shù)類型不一樣,在進(jìn)行返回的時(shí)候,會(huì)在把參數(shù)b轉(zhuǎn)化成T1類型的時(shí)候自動(dòng)創(chuàng)建一個(gè)新的局部變量,這樣就不可以用引用了,只能返回T1,而不是T1 const&

            ?

            為了解決只能返回T1T2兩種類型之一的問題,我們可以另外再加上一個(gè)額外的類型,暫且我們給他命名為returnType,那么新的模板如下:
            1template?<?typename?returnType,typename?T1,typename?T2,>
            2?inline?returnType?max(T1?const&?a,T2?const&?b){
            3????????????????return?a<b?b:a;
            4????????????????}

            5

            這種方式的時(shí)候,要使用max方法就需要指定returnType的類型,

            max<int,int,double>(1,1.2),因?yàn)樵谖覀冞@個(gè)例子里面,returnType是在第一位置,后面兩個(gè)類型是可以根據(jù)輸入?yún)?shù)類型自動(dòng)演繹(就用這個(gè)詞把,書上是這么叫的)的,所以我們可以只指定一個(gè),就是返回的類型,那么我們就可以這樣寫了max<int>(1,1.2).


            以上就是模板中參數(shù)的演繹以及出現(xiàn)問題的基本的解決方法.

            ? 以上部分來源于閱讀《C++Templates?中文版》


            posted on 2006-04-16 21:20 北風(fēng)之神007 閱讀(484) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Templates

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品成人久久久久三级午夜电影| 久久国产精品免费一区| 综合网日日天干夜夜久久| 久久精品成人欧美大片| 久久精品国产99久久久| 久久99国产精品久久久| 欧美精品福利视频一区二区三区久久久精品 | 久久AAAA片一区二区| 久久最新免费视频| 狠狠色婷婷久久一区二区三区| 久久国产精品99精品国产987| 香蕉aa三级久久毛片| 国产精品久久久久国产A级| 久久久国产精品| 久久久久国产精品| 麻豆一区二区99久久久久| 久久久久久一区国产精品| 91精品国产9l久久久久| 模特私拍国产精品久久| 久久艹国产| 久久精品国产精品青草app| 中文成人久久久久影院免费观看| 99热热久久这里只有精品68| 日韩欧美亚洲国产精品字幕久久久| 亚洲av伊人久久综合密臀性色 | 日产精品久久久久久久性色| 国产精品免费久久久久影院 | 亚洲熟妇无码另类久久久| 久久久无码精品午夜| 国产成人精品久久一区二区三区av| 久久人人爽人人爽人人片av麻烦| 久久婷婷人人澡人人| 久久成人18免费网站| 伊人久久久AV老熟妇色| 亚洲精品无码久久久| 久久九九久精品国产免费直播| 亚洲欧美国产日韩综合久久| 日本精品久久久久影院日本| 久久久午夜精品| 精品国产青草久久久久福利| 久久免费的精品国产V∧|