模板特化以及模板分離操作

2021-10-08 20:02:21 字數 1924 閱讀 9525

一、模板特化。

(一). 函式模板的特化:

函式模板的特化步驟:

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

關鍵字template後面接一對空的尖括號<>

函式名後跟一對尖括號,尖括號中指定需要特化的型別

函式形參表: 必須要和模板函式的基礎引數型別完全相同,如果不同編譯器可能會報錯。

#include

#include

using

namespace std;

template

<

class

t>

// 函式模板

bool

isequal

(t& left, t& right)

template

<

>

// 模板特化

bool isequal<

char

*>

(char

*& left,

char

*& right)

intmain()

(二). 類模板的特化:

1.全特化:

template

<

classt1,

class

t2>

//類模板

class

date

private

: t1 _a;

t2 _b;};

template

<

>

//全特化

class

date

<

int,

char

>

private

:int _a;

char _b;

};

2. 偏特化:
template

<

classt1,

class

t2>

class

data

private

: t1 _d1;

t2 _d2;};

template

<

class

t1>

class

data

int>

private

: t1 _d1;

int _d2;};

template

<

typename t1,

typename t2>

class

data

, t2*

>

private

: t1 _d1;

t2 _d2;};

intmain()

二、模板的分離編譯:(c++編譯器不支援)

1.分離編譯:乙個程式(專案)由若干個原始檔共同實現,而每個原始檔單獨編譯生成目標檔案,最後將所有目標檔案鏈結起來形成單一的可執行檔案的過程稱為分離編譯模式。

2.若在.**件中定義模板函式,在.cpp中進行編譯,則會出現錯誤。

3.錯誤原因分析

①c/c++在程式執行的時候要經歷預處理->編譯->彙編->鏈結等四步操作。

②在.cpp檔案中編譯器沒有發現對函式模板的例項化,從而無法實現函式的具體內容而導致出錯。

4. 解決方案:

①將宣告和定義放到乙個檔案 「***.hpp」 裡面或者 「***.h」 其實也是可以的。

②模板定義的位置顯式例項化(顯式例項化)。

三、模板優缺點:

模板復用了**,節省資源,更快的迭代開發。

增強了**的靈活性

模板會導致**膨脹問題,也會導致編譯時間變長

出現模板編譯錯誤時,錯誤資訊非常凌亂,不易定位錯誤

C 模板 模板特化 模板偏特化

模板是c 的乙個重要特性 使用模板 可以極大的減少類似功能 的編寫 這可以看做是c 相較於c的進步 因為這一特性在c中是不容易達到的 語言層面不支援 模板的關鍵字是 template 簡單的模板應用 template class test int main 使用模板的類在例項化時需要指明模板引數型別...

巢狀過載以及模板特化

我在用c 實現乙個鏈式棧的時候,想利用其特性實現乙個 簡單 的過載,卻不料這個過載卻是如此的艱辛,我用的是vs2013,編譯器一直出現鏈結錯誤,我檢查了好久,認為沒有錯誤,而其中大有文章。如下 pragma once include include include using namespace s...

模板和模板特化

模板分為函式模板和類模板 函式模板 是一種抽象函式定義,它代表一類同構函式。類模板 是一種更高層次的抽象的類定義。函式模板的特化 當函式模板需要對某些型別進行特化處理,稱為函式模板的特化。類模板的特化 當類模板內需要對某些型別進行特別處理時,使用類模板的特化。泛型程式設計.cpp 定義控制台應用程式...