學習之路 C 模板高階

2021-09-13 18:29:42 字數 2651 閱讀 9291

模板引數可以分為型別形參和非型別形參

型別形參:跟在class或者typename後的引數型別名稱

非型別形參:將乙個常量作為類的模板引數,在模板裡可以將該引數作為常量使用如下

template //t為型別形參,n為非型別形參

class array

可以比較int,char,double等型別的引數,但是如果比較指標型別的引數,它會比較兩指標的存的位址,而不是指向位址的值。這不是我們希望的,所以需要模板的特化模板的特化:在原本的模板函式的基礎上,根據特殊的型別進行特殊的實現方式。

模板特化分為函式模板特化與類模板特化。

必須要先有乙個基礎的函式模板

函式名後面的尖括號,尖括號的裡面寫特化的型別

函式形參表的引數必須和函式模板相同,否則會有大量的錯誤。

所以針對判斷值是否相同,針對int指標可以這麼寫

template<>

bool isequl(int* need1,int* need2)

注意,如果遇到模板函式無法處理或者處理錯誤的情況下,一般直接給出相應的函式。

bool isequl(int* need1,int* need2)

類特化的方式分為兩類:全特化,偏特化

template class text

};struct falsetype

};template class typejudge

;template <>

class typejudge;

template <>

class typejudge;

template <>

class typejudge;

template <>

class typejudge;

template <>

class typejudge;

templatevoid copy(t* dst, t* scr, int size)

else

for (int i = 0; i < size; i++)

}

需要注意的是這裡呼叫的函式為靜態函式,類的靜態成員函式可以直接訪問類的靜態資料和函式成員

分離編譯

可以理解為將乙份**分解為多個部分,如.h,.c等部分

乙個程式由若干份原始檔組成,這些原始檔編譯成為目標檔案,最後所有的目標檔案鏈結起來構成可執行檔案,這個過程就叫做分離編譯。

對模板的分離編譯

程式會報錯,因為在編譯的四個過程中:預編譯,編譯,彙編,鏈結,作用如下

1.預編譯:展開標頭檔案,巨集替換,去掉注釋,條件編譯(ifndef等語句的判斷)

2.編譯:將**轉換成彙編**,並且做了兩件很重要的事。

編譯器在每個檔案中儲存乙份函式位址符表,儲存當前檔案裡的每個函式的位址

生成一條條的彙編**,其中呼叫函式的**會生成call指令,call 指令後面跟著一條jmp指令的彙編**位址,之後跟著的才是「被呼叫函式的彙編後第一條指令」的位址彙編:將彙編**轉換成機器碼

#pragma once

#include "iostream"

using namespace std;

templatet add(const t& num1, const t& num2);

#include "test.h"

templatet add(const t& num1, const t& num2)

#include "test.h"

int main()

執行上面的**會出錯誤,錯誤資訊。

原因是因為:預編譯生成後,就生成了test.i和main.i檔案

test.i有函式的宣告實現,main.i有函式的呼叫和宣告

因此編譯器做了一件事情,fun.i生成fun.s裡面儲存了函式的位址,在位址符表裡,同理main.i生成了main.s裡面有call指令,call指令後面的位址暫時空下,等鏈結時填入,再彙編生成,main.o和fun.o檔案

同時我們知道,模板在沒有例項化時是沒有**的。

所以編譯失敗原因是因為,在展開標頭檔案時,fun.o裡只有函式的宣告實現,沒有它的例項化**,也就沒有函式位址,main.o的call指令裡的位址無法填入,導致編譯失敗

解決方法有兩個

將模板的宣告和定義寫在一起

在函式的宣告裡寫上例項化的函式,但是這種不常用。

templatet add(const t& num1, const t& num2)

template<>//例項化的模板函式

int add(const int& num1, const int& num2)

C 學習與高階之路

c 缺點之一,是相對許多語言複雜,而且難學難精。許多人說學習c語言只需一本k r c程式語言 即可,但c 書籍卻是多不勝數。我是從c進入c 皆是靠閱讀自學。在此分享一點學習心得。個人認為,學習c 可分為4個層次 c 基礎 挑選一本入門書籍,如 c primer c 大學教程 或stroustrup撰...

Android學習 高階之路

小明首先需要購買一本android入門的書籍,為了更快地學習android,小明業餘時間也都用來一邊看書一邊照著書中的例子敲 結果2周時間小明就把這本書學了一遍。看完這本書後,小明對android的歷史 結構 規範等都有了乙個大概的了解,並且,小明已經可以寫出一些簡單的activity了。這個時候在...

python高階學習之路

正規表示式 正規表示式 match函式search函式 match物件 findal函式finditer函式 compile函式 sub函式split函式 正則標誌位和模式 beautifulsoup json模組及jsonpath lxml.etree模組 網路爬蟲 爬取頁面 urllib庫 ur...