類模板和模板函式連線出錯處理

2021-07-11 20:44:07 字數 1753 閱讀 2848

對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...