1.函式模版的編譯模式分兩種:完全包含編譯模式和區域性編譯模式(需要用export關鍵字)
2.不同的編譯器對這兩種編譯模式的支援各不相同,但一般都支援完全包含編譯模式,具體支援情況需要參照具體使用的編譯器文件
模版函式和普通函式在使用的時候有一定的區別:
(1)普通函式在使用的原始檔中直接include該函式的宣告即可
(2)模版函式在使用的原始檔中既要include模版函式的宣告,也要include模版函式的定義(因為只有在編譯的時候,根據模版函式的定義進行例項化後生成的函式才是真正的函式定義)
/舉例說明完全包含編譯模式:
(1)test.h中在宣告的後面include "test.cpp ",這樣做的目的是把sum的宣告和定義放在兩個檔案中
(2)first.cpp和second.cpp中都用到了sum函式模版,所以都要include "test.h ",所以在兩個cpp檔案中都有乙份sum的定義,所以在例項化以後,存在兩個相同的函式定義:int sum(int a,int b)
(3)對於這種重複定義的問題,完全包含編譯模式下,編譯器自己會去除冗餘的函式定義,而只保留乙個int sum(int a,int b)函式的定義
(4)所以這種編譯模式下,編譯效率會降低(因為如果100的cpp檔案中都呼叫了sum(2,3),那麼會存在100個int sum(int a,int b)函式的定義,去除其餘99個冗餘定義的操作會占用大量的編譯時間)
test.h標頭檔案的內容:
template
type sum(type a,type b);//函式模版的宣告
#include "test.cpp "
test.cpp檔案的內容:
template
type sum(type a,type b)
//函式模版的定義
first.cpp檔案的內容:
#include "test.h "
int main()
second.cpp檔案的內容:
#include "test.h "
int second()
所以為了避免完全編譯模式的這種低效率,出現了區域性編譯模式
///舉例說明區域性編譯模式
(1)test.h標頭檔案中不需要再include "test.cpp "
(2)需要使用sum的cpp檔案中只需要include "test.h "即可
(3)在例項化sum函式時,編譯器會自動跟蹤到sum函式模版的定義(通過export關鍵字)
(4)這樣就提高了編譯速度
test.h標頭檔案的內容:
template
type sum(type a,type b);//函式模版的宣告
//#include "test.cpp "//不需要包含sum函式的定義
test.cpp檔案的內容:
export template //前面加上export關鍵字
type sum(type a,type b)
//函式模版的定義
first.cpp檔案的內容:
#include "test.h "
int main()
second.cpp檔案的內容:
#include "test.h "
int second()
綜上所述:export關鍵字只有在使用區域性編譯模式時才會用到,同時需要編譯器支援區域性編譯模式,如果編譯器不支援這種編譯模式,那麼不能使用export
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...
c 函式模板
關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...
C 函式模板
c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...