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

            Zero Lee的專(zhuān)欄

            類(lèi)模板的模板友元函數(shù)定義

            類(lèi)模板的模板友元函數(shù)定義有2種方式:
            1. 將友元模板函數(shù)直接定義在類(lèi)模板中。這種方式比較簡(jiǎn)單直接。
            2. 將友元模板函數(shù)聲明在類(lèi)模板中,定義在類(lèi)模板之外。這種方式的寫(xiě)法,如果不小心,通常會(huì)出現(xiàn)編譯沒(méi)問(wèn)題,鏈接時(shí)無(wú)法解析的錯(cuò)誤。
            以下是一個(gè)簡(jiǎn)單的正確的例子:
             1 #include <iostream>
             2 #include <vector>
             3 
             4 template <typename T>
             5 class Number;
             6 
             7 template <typename T>
             8 void print(const Number<T>& n);
             9 
            10 template <typename T>
            11 std::ostream& operator << (std::ostream& os, const Number<T>& n);
            12 
            13 template <typename T>
            14 std::istream& operator>>(std::istream& is, Number<T>& n);
            15 
            16 template <typename T, typename T2>
            17 void printVector(const std::vector<T2>& vt, const Number<T>& n);
            18 
            19 template <typename T>
            20 class Number {
            21 public:
            22     Number(T v) 
            23         : val(v) {}
            24     ~Number() {}
            25 
            26 private:
            27     T val;
            28 public:
            29     friend void print<T> (const Number<T>& n);
            30     friend std::ostream& operator << <T>(std::ostream& os, const Number<T>& n);
            31     friend std::istream& operator>> <T>(std::istream& is, Number<T>& n);
            32 
            33     friend Number<T>& operator += (Number<T>& a, const Number<T>& b)
            34     {
            35         a.val += b.val;
            36         return a;
            37     }
            38     template <typename T2>
            39     friend void printVector<T>(const std::vector<T2>& vt, const Number<T>& n);
            40     template <typename T2>
            41     void memFunc(const std::vector<T2>& vt, const Number<T>& n);
            42 };
            43 
            44 template <typename T>
            45 std::ostream& operator <<(std::ostream& os, const Number<T>& n)
            46 {
            47      os << n.val << std::endl;
            48      return os;
            49 }
            50 
            51 template <typename T>
            52 std::istream& operator >>(std::istream& is, Number<T>& n)
            53 {
            54     is >> n.val;
            55     return is;
            56 }
            57 
            58 template <typename T>
            59 void print<T> (const Number<T>& n)
            60 {
            61     std::cout << n;
            62 }
            63 
            64 template <typename T, typename T2>
            65 void printVector(const std::vector<T2>& vt, const Number<T>& n)
            66 {
            67     for (unsigned int i = 0; i < vt.size(); i++)
            68         std::cout << vt.at(i) << " ";
            69     std::cout << "=> " << n;
            70 }
            71 
            72 template <typename T>
            73 template <typename T2>
            74 void Number<T>::memFunc(const std::vector<T2>& vt, const Number<T>& n)
            75 {
            76     for (unsigned int i = 0; i < vt.size(); i++)
            77         std::cout << vt.at(i) << " ";
            78     std::cout << "=> " << n;
            79 }
            80 

            1) 以上代碼中,operator +=被定義在類(lèi)模板內(nèi)部。其他3個(gè)函數(shù)先被聲明(需提前聲明類(lèi)模板,如果模板函數(shù)的參數(shù)中含有類(lèi)模板),然后在類(lèi)模板中被聲明為友元函數(shù), 之后被定義在類(lèi)模板體之外。
            2) 請(qǐng)注意當(dāng)模板函數(shù)被聲明為類(lèi)模板的友元時(shí),在函數(shù)名之后必須緊跟模板實(shí)參表,用來(lái)代表該友元聲明指向函數(shù)模板的實(shí)例。否則友元函數(shù)會(huì)被解釋為一個(gè)非模板函數(shù),鏈接時(shí)無(wú)法解析。
            3) 友元模板函數(shù)的模板參數(shù)類(lèi)型,并不一定要求是類(lèi)模板的參數(shù)類(lèi)型,也可以另外聲明。


            posted on 2010-11-03 22:42 Zero Lee 閱讀(2431) 評(píng)論(0)  編輯 收藏 引用


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


            91久久精品91久久性色| 一本色道久久综合亚洲精品| 久久精品国产久精国产一老狼| 久久这里有精品视频| 国产精品久久新婚兰兰| 91精品国产高清久久久久久io | 国内精品久久久久影院免费| 久久免费国产精品一区二区| 亚洲国产成人久久一区久久| 久久99国产精品二区不卡| 久久强奷乱码老熟女网站| 婷婷综合久久中文字幕蜜桃三电影| 国产精品gz久久久| 精品久久久久久国产潘金莲| 狠狠色丁香久久婷婷综合_中| 粉嫩小泬无遮挡久久久久久| 亚洲国产成人精品女人久久久 | 欧美黑人激情性久久| 热久久视久久精品18| 久久精品国产精品亚洲下载| 久久99精品久久久久久| 亚洲国产精品成人久久蜜臀| 国产高潮国产高潮久久久91 | 国产精品九九九久久九九| 久久久久久久波多野结衣高潮| 一级做a爰片久久毛片人呢| 亚洲一区中文字幕久久| 国产精品99久久久精品无码| 热久久国产欧美一区二区精品| 99久久精品影院老鸭窝| 亚洲AV日韩精品久久久久久久 | 午夜精品久久久久久99热| 亚洲国产精品无码久久九九| 国产精品久久久久一区二区三区| 99久久99久久| 9191精品国产免费久久| 丰满少妇人妻久久久久久4| 精品久久久噜噜噜久久久| 99久久国产热无码精品免费| 久久精品毛片免费观看| 亚洲午夜久久久精品影院|