vector相關的模板類函式宣告與實現

2021-07-02 22:58:22 字數 1172 閱讀 6135

vector():start_(0), finish_(0), end_of_storage(0){}

main.cpp定義如下:

#include 

#include "smart_vector.h"

int main()

在最後的main函式中呼叫是沒有出現問題,但是在寫vector的析構函式時,我將~vector()放在smart_vector.h中進行宣告,但是我在smart_cpp對~vector()來進行定義。此時在鏈結出現了問題,在main.cpp函式中不識別~vecotr()這個外部符號,但是我已經將函式的定義放在了smart_vector.cpp中為什麼還是不識別這個外部符號呢?

原因是vector中的模板函式還是模板函式,它並沒有被例項化!!!

下面我稍微仔細地解釋一下這個過程:當我們在main.cpp中用型別int對這個vector進行例項化時,由於在標頭檔案中#include 「smart_vector.h」,編譯器會去產找相關函式。因為需要析構物件a,所以就要呼叫~vector()函式,但是在smart_vector.h中編譯器找不到函式的定義,但此時編譯器認為其他檔案中應該有~vector()的定義。所以就把這個問題留給了鏈結過程。

而現在編譯smart_vector.cpp的時候,編譯器只對smart_vector進行語法和語義的相關檢查,並編譯成可重定向的目標檔案(.o或是window中的.obj),這個過程中並沒有對~vector()進行例項化,因為並沒有引數傳入到smart_vector.cpp中,所以編譯器沒有辦法給a中需要的虛構函式~vector()宣告相關的**。這樣在鏈結過程中,編譯器在其他檔案中都找不到a物件所需要的析構函式~vector()的定義,故在鏈結過程中無法解析這個外部符號。

解決的辦法目前認為有兩種:

一、將關於函式定義的**全部放在.h中,在main.cpp中例項化是要讓編譯器看到例項化引數,這樣編譯器就可以根據int引數來找到模板類函式的宣告和定義,就可以例項化該函式,就不會出現鏈結錯誤;

二、該方法和核心思想也是在例項化時看到模板類函式的定義,即是在main.cpp中#include 「smart_vector.cpp」,這樣也不會出現鏈結錯誤。

上述兩點的核心思想都是:在例項化引數的時候,編譯器可以看到模板類的宣告和定義!!!

Vector模板類的使用

vetcor顧名思義就是乙個向量的容器,該容器中的每個元素都屬於同乙個型別,有點類似於陣列,vetor容器與陣列的不同之處就在於,它具有 動態 的屬性,舉例來說,如果定義了乙個vector容量為10,當你新增第十乙個元素時,他會自己找一篇新的足夠大領土 記憶體 然後搬家 把舊址複製過去 而陣列同志顯...

vector相關函式使用

包括vector的定義,顯示,插入,刪除等等 如下 include include using namespace std void show vector int intmain vector的定義 show nums 顯示vector內的所有資料,結果為1 2 3 4 5 6 7 8 9 10 ...

C 簡單Vector模板類

用template 來實現n維向量的相關性質。寫的時候其中有幾個關鍵的地方 1.模板類的函式定義必須和標頭檔案放在乙個cpp檔案裡,系統不支援模板類的單獨編譯。2.定義模板類的成員 友元 函式時,都要加 template or template 3.對於模板類的友元函式,都宣告成了非約束 unbou...