一、為什么使用模板??
使用模板的目的是為了避免重復聲明和定義一系列基本功能相同的函數或者類,其區別因傳入參數的不同而產生不同類型的數據,其基本工作過程都是一致的!
二、調用模板函數產生不明確問題
(1)template declarations are only permitted at global ,namespace ,or class scope
模板聲明只允許在全局、命名空間或類范圍內使用!故不能在main函數中直接定義。
(2)conld not deduce template argument for T
不明確傳遞給fun()函數的T類型!
解決方法,可以在調用的時候加以聲明。
(3)對於傳入模板的參數不同的問題
模板函數的參數類型定義的是double,調用時確是int和float,實際即為類型轉換問題。
(4)模板繼承問題
- 如果父類自定義了構造函數,記得子類要使用構造函數列表來初始化
- 繼承的時候,如果子類不是模板類,則必須指明當前的父類的類型,因為要分配內存空間
- 繼承的時候,如果子類是模板類,要么指定父類的類型,要么用子類的泛型來指定父類
(5)友元函數未定義問題
在編譯器進行編譯的時候,編譯器會產生類的模板函數的聲明,當時實際確認類型后調用的時候,會根據調用的類型進行再次幫我們生成對應類型的函數聲明和定義。我們稱之為二次編譯
。同樣,因為這個機制,會經常報錯找不到類的函數的實現
。在模板類的友元函數外部定義時,也會出現這個錯誤。解決方法是 “ 進行類的前置聲明和函數的前置聲明 ”。
(6)聲明和定義不在同一個文件的問題
模板的聲明是在.h文件,定義是在.cpp文件,因編譯時只產生聲明的代碼,故編譯不會出錯,但是當調用時會產生找不到類或者函數的問題,
解決方法:1、將模板的聲明和定義放在同一個文件中
2、主函數中調用#include<.cpp>或者將.cpp文件改為.hpp文件再引用
快牽着我的襪子
參考:https://www.jianshu.com/p/70ca94872418