模板引數,模板分離編譯

2021-08-22 11:52:11 字數 1401 閱讀 9735

1.型別形參:

templatevoid h(t a) 

templatevoid h(t a,t b) 

{} void test()

這樣的呼叫方式會出錯,因為該語句給同一模板形參t指定了倆種不同的型別(int,double)

2.非型別模板形參:

非型別模板形參的形參和實參間所允許的轉換

允許從陣列到指標,從函式到指標。

templateclass a 

{};

void test()

2.const修飾符的轉換

templateclass a {}; 

void test()

3.提公升轉換(short——int)

4.整值轉換(int ——unsigned int)

模板形參總結:

型別引數:可以給類模板的型別形參提供預設值,但不能給函式模板的型別形參提供預設值。

非型別引數:函式模板和類模板都可以為類模板的非型別形參提供預設值

給類模板的型別形參預設值的方式:

templateclass aa{};
類模板的型別引數提供預設值的方式與函式預設一樣,要從右向左,不能給t1提供預設值而不給t2。

在類模板的外部定義類中的成員時template後的形參表應省略預設的形參型別 

template class a 

;viod a::h()

{}

模板的模板引數:

3.模板的分離編譯:

解決方法:

在模板標頭檔案***.h裡面顯示例項化->模板類的定義後面新增template class seqlist;

一般不推薦這種方法,一方面老編譯器可能不支援,另一方面例項化依賴呼叫者

將宣告和定義放在同乙個檔案「***.hpp」裡面,新增使用這種方法 

可變引數模板

乙個可變引數模板就是乙個接受可變數目引數的模板函式或模板類。可變數目的引數被稱為引數包 parameter packet 存在兩種引數包 模板引數包 template parameter packet 表示零個或多個模板引數 函式引數包 function parameter packet 表示零個或...

可變引數模板

可變引數,也就是讓函式可以接受可變數量引數的函式。使用方法 m print 也就是0引數將會在可變引數函式m print t x,args.args 呼叫void m print 可變引數模板 可變引數模板m print t x,args.args 通過遞迴呼叫m print args.或者m pr...

可變引數模板

三個點代表此處的u為一包型別,b為一包形參,可以輸入任意多的引數,sizeof.可以檢視一包引數中的引數個數,不是占用的位元組數。引數包的展開 如何去處理引數包裡的每乙個引數呢,這裡就需要用到遞迴的展開方法 void func templatevoid func const t a,const u ...