template學習筆記

2021-09-30 07:32:31 字數 1645 閱讀 9468

特化與偏特化:

特化說白點就是專門為我們指定的一種型別再寫一次模板定義,例如:

一般情況是這樣定義模板的:

template

inline t const& add(t const& t1, t const& t2)

return t1+t2;

特化,把我們的add為我們指定乙個型別的實現(int):

template<>

inline int const& add(int const& t1,int const& t2)

return t1+t2;

如果現在乙個檔案呼叫了add模板函式,如果是用了int型別作為引數,那麼我們特化後的函式會被呼叫。也就是說我們可以為某一型別的

模板函式做另一種實現。假如說當是std::string型別的時候,我們會做一些與內建型別不同的操作

下面這種

template

inline t3 const& add(t1 const& t1, t2 const& t2)

...偏特化:算是一種封裝吧。

template

inline t const& add(t const &t1,t const& t2){

...以上的兩種情況,在單獨編譯模板檔案的時候都是不會產生相應的函式(add)的**的。

那麼這樣一來的話,假如我們寫了乙個模板,然後把宣告跟具體實現分開在  1.h 與 1.cpp裡面,

編譯檔案

g++ 1.cpp 1.h -c =>生成1.o 

這樣是沒問題的,但是裡面並不會有所謂的 add函式可執行**。

當我們寫了主檔案main.cpp來呼叫add的時候,往往我們會#inlucde一下頭檔案1.h,接著使用:

g++ main.cpp -c =>生成main.o

這時編譯沒問題,因為編譯器為函式找到了宣告,但沒發現具體實現,此時編譯器相應我們的函式是會有具體實現的,所以相信具體實現

g++ main.o 1.o -o main =>欲生成main可執行檔案。

這時會出錯,錯誤的內容是找不到add的實現,因為鏈結器在鏈結的時候會從1.o檔案裡面去找add函式的具體實現,而在裡面是肯定找不

到的,因為之前根本就沒有生成相應的**。

一般來說解決這個問題就是把所有的實現都寫進 1.h裡面,讓呼叫add函式的檔案在編譯的時候也把 add函式給編譯生成出來,本來

template定義的東西就該是在被呼叫的時候才會為其生成相應型別的**。

template為了泛型程式設計而產生的,所以當用了模板的程式在編譯的時候,會同時為該函式生成相應型別的**。

假如說我們不想要template在我們具體被呼叫並編譯的時候才生成可執行**的話,我們就要顯示地指定編譯器在編譯的時候去實現了。

只需要在我們的1.cpp檔案時候加上  

template inline int const& add(int const& t1,int const& t2);

這樣的話在執行1.o的生成的時候是會為int型別的add函式生成相應的可執行**的,假如我們的main裡面是呼叫的add(int,int)的話,然後在g++ main.o 1.o -o main的時候,鏈結器可以在1.o裡面找到add函式的具體實現,編譯通過。

template模板學習

匯入這個模板來使用 template web.js script 這個模板的github 匯入後可以使用template的函式和格式進行模板的開發 符號包裹起來的語句則為模板的邏輯表示式。輸出表示式 對內容編碼輸出 不編碼輸出 條件表示式 adminp masterp error p 遍歷表示式 l...

設計模式學習筆記 模板 Template 模式

設計模式 設計模式,模板模式,template,模板方法 模板模式中的角色 模板模式可以很簡單的理解為,通過同乙個模具倒出來的模型。形狀上是一樣的,但是其上的花紋,紋理等卻可能完全不一樣。這裡的模板模式,特指template method模板方法模式。其原理為父類制定好規範 待實現的方法和模板方法。...

小程式學習筆記(四)template模版

概念 將相同的 塊抽離出來,在模板中定義 片段,然後在不同的地方呼叫。模版的定義與使用 1 定義模板 在內定義 片段,template中的 name 屬性接收乙個字串作為該模板的名字。如 msgitem 該模版的名字 2.使用模板 在其他所需要的檔案最上方引入使用的src屬性將相關模板引入 is 用...