前幾天寫了乙個模版,按以前的習慣,把定義寫在標頭檔案中, 把實現寫在cpp檔案中。結果在編譯的時候沒有發生錯誤,但在連線的時候出現了找不到***的錯誤。一時之間不知道該怎麼辦才好,後來上網一查,自己再一想,唉,原來如此:
模版之所以為模版,就是可以容納不同的型別嘛,所以它只有在指定了其型別的時候才會生成實際的**,如果你只把模版的定義寫在標頭檔案中,那麼你生成在使用模版的時候就只會有宣告的定義部分,而沒有其具體的實現,所以鏈結器在連線時會報錯。
解決的辦法有兩個:
1. 把模版的宣告和實現都寫在乙個標頭檔案中,然後用的時候包含這個標頭檔案。
2. 如果你已經把它們分開了,比如說***.h ***.cpp。那也好辦,只好在使用的時候#include 「***.h」 #include 「***.cpp」即可。
可能有時候我們需要限定我們所編寫的模板的應用範圍,我們可以通過下面的方式實現.在實現之前我們應該簡單的說明一下,c++編譯器對模板的處理過程:
編譯器遇到模板定義時會進行語法檢查,但不進行編譯,當編譯器遇到遇到乙個例項化的模板時,才會編譯出對應例項化型別的例項化**,進而生成目標檔案,供我們鏈結程式時使用,這似乎說明如果我們只是定義了模板,而沒有使用,那麼到最後我們的目標檔案中是找不到模板的蹤影的,我們也就是抓住模板的這個特性,在實現模板方法的原始檔中新增模板的對應型別的顯示例項化,那麼最後這個原始檔也將只包含我們例項化後對應模板類的定義,如果某個型別我們沒有在這個原始檔中對其進行顯示例項化,我們這個原始檔生成的目標檔案中將不會包含這個未例項化模板的類的定義,如果我們在其他檔案中嘗試模板去例項化新的型別,將會出現連線錯誤。
根據以上說明,我們的實現步驟大致如下:
1.模板的宣告放到乙個標頭檔案中
2.模板的實現放到另外乙個原始檔中
3.在實現模板的原始檔中顯示的特化本末班支援的型別
c++模板類程式設計的鏈結問題
C 小問題集錦
摘要 在學習 c 語言程式設計中遇到的一些容易混淆出錯的問題,記錄下來備忘。c語言學習 小問題集錦 參考 章節 正文 一 陣列元素 a n 是 a n 還是 a n 1 在學習排序中,看到了一種寫法,a n 這個a n 到底是 a n 還是 a n 1 不用多說,上測試 include int ma...
面試 C 多型問題集錦
答 多型是物件導向的重要特性之一,它是一種行為的封裝,是同一種事物所表現出的多種形態,簡單地說是 乙個介面多種實現 答 有兩種型別的多型性 答 多型有動態多型,靜態多型,函式多型和巨集多型等。動態多型基於繼承機制和虛函式來實現的。靜態多型引入了泛型的概念。函式多型基於函式過載。巨集多型基於巨集替換。...
C 常見問題集錦
1 new delete是c 的操作符,而malloc free是c中的函式。2 new做兩件事,一是分配記憶體,二是呼叫類的建構函式 同樣,delete會呼叫類的析構函式和釋放記憶體。而malloc和free只是分配和釋放記憶體。3 new建立的是乙個物件,而malloc分配的是一塊記憶體 new...