傳統編寫c++類時,都會將類的宣告放在.**件中,類的實現放在.cpp中,但在模板類及對應的模板函式編寫時,如果還這樣做,那麼主函式編譯時就會報錯。
這是因為,模板函式只有在被例項化後才能成為真正的函式
。如果main()函式中只包含.**件,那麼模板類對應的函式沒有定義,編譯的時候定然不會通過。
例如 一般情況下的類實現:
template
<
typename t>
class
test
; #include
"test.h"
void test::
print()
#include
"test.cpp"
intmain()
編譯時會生成main.obj
和test.obj
檔案,因為有兩個.cpp
,而main.obj
中並沒有print()
函式的二進位制**,因為print()
是在test.cpp
中,這樣,main.obj
中對print()的呼叫只會用乙個call指令
來完成,這個call指令
的位址由鏈結器生成。
又如 模板類:
template
<
class
t>
class
test
; #include」test.h」
template
<
class
t>
void test
::print()
#include」test.h」
intmain()
模板有個具現化的過程,在未被使用時,並沒有其所在位址,這樣,當鏈結器去找print()
的位址時,必然找不到,因為之前沒有呼叫過它,test.obj
中也沒有它的二進位制**,這樣就會報錯。
1.將模板類的實現和模板類的宣告放到乙個.**件中
template
<
class
t>
class
test
;template
<
class
t>
void test
::print()
#include」test.h」
intmain()
2. 主函式檔案中引入模板類函式的實現
template
<
class
t>
class
test
; #include」test.h」
template
<
class
t>
void test
::print()
#include
"test.cpp"
intmain()
3. 模板類宣告檔案中引入其實現檔案
template
<
class
t>
class
test
;#include
"testimpl.h"
template
<
class
t>
void test
::print()
#include」test.h」
intmain()
C 中的模板(類模板 模板類 模板函式)
1 class 一般class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別 2 typename 為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為乙個型別...
C 模板函式,模板類
模板如字面的意思為模具模板,並不是乙個正真的物體。例如,在編寫比較兩個數大小的 中,我們可能要比較兩個整數的大小,也能需要比較浮點數等等大小。在這些 中,基本的邏輯都是相同的,只是比較數的型別不同。此時我們就可以用模板這個概念來完成對於不同型別的引數而相同的邏輯的操作。而模板會根據實際的引數型別推演...
C 模板函式與類模板
函式模板提供了一種函式行為,該函式行為可以用多種不同的型別進行呼叫,也即是說,函式模板代表乙個函式家族。includetemplatet max t const a,t const b 無參建構函式 stack stackconst 拷貝建構函式 stack operator stackconst ...