解析C++中爲什麼模板不支持分離編譯?

在C++中,我們通常把代碼歸爲三類:聲明文件( test.h )、實現文件( test.cpp )、測試文件( main.cpp )。

例:用C++實現一個鏈表,那麼就會創建以上3個文件:
鏈表的一般寫法是沒有問題的
如果,通過類模板來實現鏈表,編譯器就會報錯
這裏寫圖片描述


這裏寫圖片描述

這是因爲編譯SeqList< T >時沒有實例化出SeqList< int >所以鏈接時出錯。
模板第一次編譯是在實例化之前,用來分析基本的語法錯誤,第二次編譯是在實例化之後,當把這個類型替換之後,判斷有沒有語法錯誤。
模板代碼的實現體在一個文件裏,而實例化模板的測試代碼在另一個文件裏, 編譯器編譯一個文件時並不知道另一個文件的存在,因此,模板代碼就沒有進行實例化,編譯器自然不會爲其生成代碼,因此會拋出鏈接錯誤!
解決辦法:
在模板頭文件 xxx.h 裏面顯示實例化->模板類的定義後面添加 template class SeqList< int >;
將聲明和定義放到一個文件 “xxx.hpp” 裏面,推薦使用。

更加詳細內容請關注:http://blog.csdn.net/pongba/article/details/19130

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