模板函數 實例化與具體化


        首先,實例化從字面上來看就是產生一個實際的事物。在函數模板中就是產生一個特定的函數定義,例如有一個swap函數:

        template<typename T>

        void swap(T& a,T& b) {…}

        使用模板,並不意味着我們生成了一系列的函數定義,而是一種方案,當我們傳遞類型進入的時候才生成出對應的swap函數定義,比如現在swap<int>(a,b) 實際上就是產生了void swap(int a,int b);這樣的一個函數定義,這被稱之為隱式實例化,即在編譯的時候提供類型創建一個對應的函數定義。

        在以前C++只支持隱式實例化,但現在增加了顯式實例化,也就是說可以顯式的定義出類型,並對之實現對應的函數定義。顯式實例化的語法是聲明所需的種類,用<>符號指示類型,並在聲明前加上關鍵詞template,例如:

        template void swap<int>(int,int);

        當編譯器看到這行聲明后,將使用swap模板生成一個使用int類型的實例。也就是說,該聲明的意思是使用swap模板生成int類型的函數定義。

       

        其次是,顯式具體化,同樣是int類型,顯式具體化可以有這樣兩種寫法:

        template <> void swap<int>(int&,int&);

        template <> void sawp(int&,int&);

*在同一個文件中使用同一種類型的顯式實例化和顯式具體化將爆炸

        然而,顯式具體化是阻止使用模板方案來生成對應的函數定義,並且使用專門為int類型顯式地定義的函數定義,簡單來說就是為int類型專門寫了一個對應的版本。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM