對c++編譯器而言,當呼叫函式的時候,編譯器只需要看到函式的宣告。當定義類型別的物件時,編譯器只需要知道類的定義,而不需要知道類的實現**。因此,因該將類的定義和函式宣告放在標頭檔案中,而普通函式和類成員函式的定義放在原始檔中。
但在處理模板函式和類模板時,問題發生了變化。要進行例項化模板函式和類模板,要求
編譯器在例項化模板時必須在上下文中可以檢視到其定義實體;而反過來,在看到例項化模板之前,編譯器對模板的定義體是不處理的——原因很簡單,編譯器怎麼會預先知道 typename 實參是什麼呢?因此模板的例項化與定義體必須放到同一翻譯單元中。
《c++程式設計思想》第15章(第300頁)說明了原因:
模板定義很特殊。由template<…> 處理的任何東西都意味著編譯器在當時不為它分配儲存空間,它一直處於等待狀態直到被乙個模板例項告知。在編譯器和聯結器的某一處,有一機制能去掉指定模板的多重定義。所以為了容易使用,幾乎總是在標頭檔案中放置全部的模板宣告和定義。
以下是模板宣告和定義的兩種方法:
1)可以通過在宣告函式模板或類模板的標頭檔案中新增一條#indlude指示定義可用,引入了包含相關定義的原始檔。
file
#ifndef _set_h_j
#define
_set_h_j
#include
<
list
>
template
<
class
t>
class
set_j
;#include
"set.cpp
"#endif
// set.cpp file
#ifndef _cpp_set_j
#define
_cpp_set_j
#include
"set.h
"#include
<
algorithm
>
template
<
class
t>
std::size_t set_j
<
t>
::size()
template
<
class
t>
void
set_j
<
t>
::insert(
constt&
item)
}template
<
class
t>
void
set_j
<
t>
::remove(
constt&
item)
}template
<
class
t>
bool
set_j
<
t>
::is_has(
constt&
item)
#endif
// main.cpp file
#include
<
iostream
>
#include
"set.h
"void
main()
2)通過關鍵字export實現。
在 vs 2008 中,export 關鍵字在 ide 中被標藍,表示 vs ide 認識它,而編譯時,會用警告友情提示你「不支援該關鍵字」。
3)將定義和實現檔案寫在乙個檔案中。
出錯處理函式
我們知道,系統函式呼叫不能保證每次都成功,必須進行出錯處理,這樣一方面可以保證程式邏輯正常,另一方面可以迅速得到故障資訊。出錯處理函式 include include char strerror int errnum see notes errnum 傳入引數,錯誤編號的值,一般取 errno 的值...
類模板,模板類和函式模板,模板函式
單整數類 雙整數類 所以c艹跟其他強型別語言為我們提供了乙個所謂模版功能 變數型別 整數 類模板的重點是模板。表示的是乙個模板,專門用於產生類的模子。例子 1 template 2 class vector 3 使用這個vector模板就可以產生很多的class 類 vector vector ve...
函式模板 和類模板
還是例子說話。函式模板 templatemax const t a,const t b 這樣用 int int a 1,b 2 max a,b float float c 1.0f,d 2.0f max c,d double double e 1.0,f 2.0 max e,f 類模板 templa...