C++模板類聲明與定義的相關問題

   問題起因:在完成Essencial C++第五章課後題時,定義了一個模板類同時時接口類,然後定義了一個子類去繼承這個模板類,然後子類的實現在單獨的cpp文件中進行,編譯的時候報錯LNK2019 無法解析的外部符號 "public: void __thiscall XXX,遂百度之,大多數說法都是,找不到lib,或者是隻找到了方法的聲明,沒找到實現,我想這也不可能啊,我右鍵方法,然後找到聲明都找得到,問啥會出這個問題呢?後來發現是關注點錯了,這個問題的原因是涉及到了模板類的聲明與定義

   

   然後百度了關於C++模板類的相關問題,果然是一個問題牽出了其他的好多問題,對於這個問題的說明,這裏直接轉載兩位大佬的博客,說的很詳細

1.細談 C++ 類模板的分離式編譯https://blog.csdn.net/u012814856/article/details/84645963

2.模板類型聲明和定義https://www.cnblogs.com/wonderKK/archive/2011/11/07/2240370.html

總結一下就是:在編譯的時候,不會爲模板類生成二進制代碼,這時模板類只是一具軀殼,麼得靈魂(因爲如果要開闢空間的話,連具體的類型都不知道,如何去開闢空間呢),只有當發生了調用時,編譯器纔會給模板類去注入靈魂(即提供具體的類型),開闢空間。那麼爲什麼必須把聲明和定義寫進  .h 的頭文件當中呢,因爲我們將其寫到一起之後,會在頭文件中同時找到模板類具現化所需的全部信息,因爲他們都在一個文件中。但如果我們把聲明和定義分別放在h和cpp文件中,但是我們的main函數所在的源文件中僅僅包含了模板類的聲明,在編譯的時候沒有發現模板類具現化所需要的內容,於是認爲該部分在其他文件中實現,將該任務交給鏈接器,但是鏈接器並沒有找到模板類具現化的內容,因爲我們在定義模板類的時候,使用的是 template<typename elemType>,並不是int 或者 float等具體類型,所以編譯器也找不到會報錯說無法定義的外部符號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章