05模板學習之模板類外實現過載運算子和友元函式

2021-10-11 11:14:37 字數 3049 閱讀 7923

注意1:

本文中說的類外是指在單檔案的.cpp中實現模板的運算子過載和友元函式,不包含.**件。

注意2:

本測試專案在main.cpp中測試,即是乙個單檔案,模板的單檔案和.h、.cpp是有區別的,與平常的普通分離.h,.cpp不一樣。

1 友元函式在類模板的寫法

//方法2-友元函式在類模板的宣告

template

<

class

t>

class

person

;template

<

class

t>

void

printperson

(person

& p)

;template

<

class

t>

class

person

;template

<

class

t>

person

::person

(t age, t id)

template

<

class

t>

void person

::show()

//友元函式中可以訪問物件的私有資料或者函式,但必須前提有物件

template

<

class

t>

void

printperson

(person

& p)

void

test01()

intmain()

上面類模板中可以看到,友元函式在模板類中的宣告必須加上template,否則會出錯(某些編譯器不會報錯但是不能生成,某些編譯不會報錯並且能生成,與系統並且與編譯器版本相關)。

//普通友元函式在類模板的寫法

template

<

class

t>

friend

void

printperson

(person

& p)

;

//方法2-友元函式在類模板的宣告

template

<

class

t>

class

person

;template

<

class

t>

void

printperson

(person

& p)

;//並且需要在friend的語句中加上

friend

void printperson

(person

& p)

;//方法2需要加上

注意:若你沒有呼叫到友元函式的話,即使你沒正確寫宣告,它也不會報錯,因為你根本沒有使用到這些模板,只有呼叫了才會報錯(不一定主函式main中呼叫,其它普通函式中呼叫也行),下面的運算子亦如此。

2 過載運算子在模板的實現

實際上過載運算子和友元函式的實現是完全一樣的,這裡寫出來只是為了加深記憶。

1)運算子過載在模板中的實現方法1:

//過載左移操作符

template

<

class

t>

friend ostream&

operator

<<

(ostream& os, person

& p)

;

2)方法2:

步驟同上,這裡不寫了。

完整**如下:

//方法2-友元函式在類模板的宣告

template

<

class

t>

class

person

;template

<

class

t>

void

printperson

(person

& p)

;//方法2-過載運算子在類模板的宣告,與友元函式完全一樣

//templateclass person;由於上面寫了一次person的宣告,這行可以省略

template

<

class

t> ostream&

operator

<<

(ostream& os, person

& p)

;template

<

class

t>

class

person

;template

<

class

t>

person

::person

(t age, t id)

template

<

class

t>

void person

::show()

//過載左移運算操作符

template

<

class

t>

ostream&

operator

<<

(ostream& os, person

& p)

//友元函式中可以訪問物件的私有資料或者函式,但必須前提有物件

template

<

class

t>

void

printperson

(person

& p)

//測試友元函式

void

test01()

//測試運算子過載

void

test02()

intmain()

c 模板學習09之類模板函式類外實現

類模板的建構函式在類外實現 include include using namespace std 類模板與繼承 template class t class baba baba類模板的建構函式在類外實現 第一種寫法 baba int baba 第二種寫法 template class t baba...

模板學習(2) 類模板

模板的作用我們已經知道了,類模板的作用就是建立乙個可以公用的類,這個類模板裡面的成員及其資料型別不用制定,同樣是由乙個虛擬的型別來表示的。類模板中的資料成員以及成員函式的引數和返回值都可以進行任意資料型別的選擇,乙個類模板定義好之後,可以減少定義宣告符合該模板的類的數量。類的使用如下 templat...

模板完全特化,函式過載的過載,類模板的繼承

模板完全特化,函式過載的過載,類模板的繼承 模板用於對類或函式的定製。當模板的泛化處理不適合某個特定的資料型別時,可針對這個資料型別給出相應的模板,包括函式模板和類模板。1 函式模板完全特化 函式模板完全特化是在函式模板定義後,再用關鍵字template 給出特定型別下的函式模板定義,表明它是乙個沒...