關於函式模板在類模板中宣告為友元的一些心得

2021-04-26 17:43:46 字數 1268 閱讀 6801

用類模板設計時,有時需要在類定義中宣告友元函式,比如過載輸出操作符<<,而當友元函式是模板函式時,則需要滿足一些宣告和定義的規則。

如,當我編寫乙個順序錶類模板時,加入了過載《的友元模板如下:

template class seqlist;

此時在main.cpp檔案中定義operator << 如下

template

ostream& operator << (ostream& os,const seqlist& slist)

編譯通過,但鏈結報錯!error lnk2019: 無法解析的外部符號 ……

由於我水平有限,至今仍不能讀懂鏈結錯誤,唯有求助網路及紅寶書(c++ primer)了。

以下來自c++ primer:

在類模板中可以出現三種友元宣告……

(1)普通非模板類或函式的友元宣告,將友元關係授予明確指定的類或函式。

(2)類模板或函式模板的友元宣告,授予對友元所有例項的訪問權。

(3)只授予對類模板或函式模板的特定例項的訪問權的友元宣告。

……想要限制對特定例項化的友元關係時,必須在可以用友元宣告之前宣告類或函式

……讀完後我的理解是

當宣告的友元函式不是模板函式,或者該函式是與類模板有不一樣的typename的函式模板時,在類中宣告該函式友元相當於宣告了該函式。

但顯然,上述遇到的問題屬於第(3)種,而按書中所說,在宣告友元std::ostream& operator 《時,應當先在類seqlist定義之前宣告該函式(而這又意味著在宣告該函式前還需先宣告類seqlist——template class seqlist;)

在csdn論壇中又搜到另一種方法。

上述問題的解決辦法可總結如下兩種:

1、宣告友元前先宣告函式模板,原方案變為

template class seqlist;//宣告類

template //宣告過載函式模板

std::ostream& operator << (std::ostream&,const seqlist&);

template class seqlist

//定義函式模板時不變

template

ostream& operator << (ostream& os,const seqlist& slist)

2、無需在類定義前宣告函式模板,而是將友元函式的定義直接寫在類的定義中

template class seqlist

}

怎樣把函式模板宣告為類模板的友元

怎樣把函式模板宣告為類模板的友元 給類模板宣告友元的函式模板有三種方式,分別為 第一種方式,在模板類內部宣告友元的函式模板 第二種方式,在模板類內部宣告對應版本的友元函式模板例項化 需要前置宣告 這種方式是最為合理的方式 第三種方式,在模板類內部直接宣告友元函式,不涉及函式模板 這種情況只能在模板類...

模板類宣告友元函式

問題描述 如題,先看不報錯的 如 templateclass test template 2 void fun test data 因為需求傳遞需要函式指標,通過fun函式對類內私有成員進行操作。如果定義類內成員fun,則需要修改傳參。但是非要用友元函式怎麼辦呢。如果有1沒有2,則報錯 成員無法訪問...

模板 函式模板 類模板

模板主要是針對資料型別,不同的資料型別卻具有相同的操作形式,比如說,同樣是做入棧,int和double由於資料型別不一樣,需要做兩個棧才能滿足需求,誠然可以使用函式過載,但是終歸棧的操作是一樣的,只是資料型別不一樣。所以在此基礎上,假設,我們首先將所有的資料型別視為乙個大類,將它引數化,等到要用的時...