模板類中如何定義友元函式?

2022-07-03 11:33:10 字數 1222 閱讀 6913

今天看到乙個演算法題,就是如果有兩個大整數求和,但是這兩個大整數的取值範圍超過了計算機能表示的範圍,要怎麼辦?

正好之前看了線性表的順序儲存結構,覺得可以將大整數的每一位儲存到陣列中,然後對陣列進行對應位的計算!線性表的順序儲存結構的

實現可以看我的前面的部落格,有介紹。現在要寫乙個大整數求和的演算法,即用兩個線性表進行相加,所以要將這個演算法函式宣告為順序錶類的友元函式,

以此來讀取類的私有成員!具體實現如下:

template//

定義模板類

class

seqlist

; //

建構函式,將大整數的每一位存到陣列中,陣列低位放置整數的高位

templateinline seqlist

::seqlist(int a, int

n) length =n;}//

具體演算法 ,結果放入表a中

templateseqlist

add(seqlist&a, seqlist&b)

//計算大整數a餘下的部分

for (; i < n; i++)

//計算大整數b餘下的部分

for (; i < m; i++)

int d = (n > m) ?n : m;

if (flag == 1

)

returna;}

intmain()

寫完編譯,出錯!

感覺寫的很對,怎麼錯了呢??找錯吧。。。

函式add並不是乙個模板函式,而下面卻用模板函式定義

於是進行修改,修改如下:

template//

定義模板類

class

seqlist

;

如上修改之後,順利通過編譯!

執行結果如下:

結果正確。

類模板的模板友元函式定義

類模板的模板友元函式定義有2種方式 1.將友元模板函式直接定義在類模板中。這種方式比較簡單直接。2.將友元模板函式宣告在類模板中,定義在類模板之外。這種方式的寫法,如果不小心,通常會出現編譯沒問題,鏈結時無法解析的錯誤。以下是乙個簡單的正確的例子 1 include 2 include 3 4 te...

模板類中的友元函式

模板類中友元函式不要濫用,最好只用來過載左移和右移運算子 和 如果用於普通友元函式過載,會非常麻煩,即使類模板定義和宣告分開,也建議都寫在.h或.hpp檔案中,即要保證模板類的定義和宣告在乙個檔案中,否則,將不能找到函式的定義,這和模板的二次編譯有關。參見官方的stl庫風格可知,它也遵循這一原則,即...

模板類的 友元模板函式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 include include usingnamespacestd template classt c...