1. 程式人生 > >C++在類模板中實現友元函式的方法

C++在類模板中實現友元函式的方法

在類模板中過載了運算子,並把該函式宣告為友元函式.如果在類體外定義該友元函式(外部函式),則出現如下編譯錯誤:

main.obj:errorLNK2019:無法解析的外部符號"class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class SeqList<int> const &)" (

[email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@@@Z), 該符號在函式 _main 中被引用

 fatal error LNK1120: 1 個無法解析的外部命令

這是一個連結期錯誤,原因是過載外部運算子函式沒有在宣告為友元時顯式宣告其模板引數列表

實際上,如果定義類似

template<typename T>void show(Pig<T>& _pg)

{

   _pg.x = 8;//修改Pig類的私有成員

   cout << "Pig的成員: " << _pg.x << endl; //參閱Pig類的私有成員!

}

的模板函式,要將其定義為友元函式,應該使用的不是

friend void show(Pig<T>& _pg);

而是

friend void show<T>(Pig<T>& _pg);

template<typenameT>

friend void show(Pig<T>& _pg);

,因為show()

不是函式的idshow<T>()才是函式的id,所以一定要在定義友元函式時顯式宣告模板引數表

相關推薦

C++在模板實現函式方法

在類模板中過載了運算子,並把該函式宣告為友元函式.如果在類體外定義該友元函式(外部函式),則出現如下編譯錯誤: main.obj:errorLNK2019:無法解析的外部符號"class std::basic_ostream<char,struct std::char

C++模板函式的宣告和定義分別放在哪裡

        前面提到了模板的宣告和定義推薦都放在標頭檔案中,那麼該類中的友元函式的宣告和定義該放在哪裡呢?         因為友元函式並不屬於這個類, 按照習慣,我們一般把宣告放在類中,而把定義放在類的外面。但對於類模板來說,這樣就出問題了。很多編譯器並不支援將友元函

C++ - 模板(class template)(friend) 的 全部六種形式 及程式碼

#include <iostream> #include <string> template <typename T> class Pal; //pal朋友,這裡模板類的前置宣告 class C { friend class Pal<C>;

模板使用函式的方式,派生函式對基的成員使用情況

在一般友元函式的前面加上 template<typename T),注意在函式的宣告和定義處都要加這個模板 例如: //模板類,長方體類 template <typename ElementType> class Rectangle { ///*過載基類的輸入輸出運算子*/

模板含有函式的書寫規範

template <class T> class person; //模板類的宣告 template <class T> void show1(person<T>& ); //友元函式的宣告 template <class T> cl

C++模板與運算子作為函式過載

我自定義了一個模板類並重載了運算子,預定義實現功能為能實現對陣列一般操作,類似於vector。 #ifndef ARRAY_H #define ARRAY_H #include <iostream> using namespace std; templa

YTUOJ——C++ 習題 輸出日期時間--函式

題目描述 設計一個日期類和時間類,編寫display函式用於顯示日期和時間。要求:display函式作為類外的普通函式,分別在Time和Date類中將display宣告為友元函式。在主函式中呼叫display函式,display函式分別引用Time和Date兩個類的物件的私有資料,輸出年、月

C++模板如何正確的訪問同是模板的父的成員?

1 C++類模板中如何正確的訪問同是類模板的父類中的成員(g++編譯器)? 先看如下程式碼: #include <iostream> using namespace std; template < typename T > class

C++模板的static

#include<iostream> using namespace std; template <typename T> class A { private:     int m_a; public:     static T count;   

C++--模板的static關鍵字

在類模板中定義一個static 型別的變數會發生什麼呢? 首先先看程式碼#include <iostream> using namespace std; template <typ

二叉樹擴充套件之三叉樹C++模板實現

簡介 二叉樹是遞迴定義的,這裡的三叉樹同樣也是。 三叉樹分為左子樹,中子樹,右子樹。 三叉樹的遍歷順序方式,我把它則分為四種: (1)先序:根->左->中->右 (1)中1序:左->根->中->右 (1)中2序:左->中>根

關於模板函式的宣告與定義

//Widget.h #ifndef _WIDGET_H_ #define _WIDGET_H_ #include <iostream> using namespace std; template<class T> class Widget {

C++模板宣告

對於在一個類中宣告一個函式或者一個類的友元,我們應該是十分熟悉了,但是這兩天在做題的時候遇到一個問題,就是如何在一個類模板中宣告一個模板函式與我們的模板類的友元關係? 剛開始遇到這個問題的時候,說實話我有點懵,因為之前根本沒考慮到這一層,所以趁這次機會又將模板和友元相關的東

C++實現輸入輸出運算子過載、函式和成員函式實現複數Complex

今天答應幫朋友做一個C++題目,頗費了一番周折,終於還是寫出來了,讓很久沒敲程式碼的我反省了一下,也回憶了以前學過的知識。 題目要求如下: 一、按下列要求編制複數類,並除錯通過: 1)  基本的建構函式; 2)  成員運算子+、-實現複數的加減運算; 3)  友元運算子+

模板包含模板和其他函式

發表一點自己對 《C++ Primer 5th》模板那塊的理解, 歡迎指正 一對一友好關係 在類模板與另一個模板(模板類或模板函式)間建立對應例項及其友好關係,為了在類模板中引用另一個類模板或函式的一個特定例項,必須先宣告另一個模板: 方便理解和敘述,將含

C++模板函式)宣告的三種情況

根據《C++ Primer》第三版16.4節的敘述,C++類模板友元分為以下幾種情況1.非模板友元類或友元函式。 書上給了一個例子:class Foo{    void bar();};template <class T>class QueueItem{   

C++函數和

pan string 拷貝構造函數 student 私有 oid 一個 each cor 友元函數可以修改類的私有屬性,寫在類的public/private/protected底下都可以。友元函數的函數體寫在類的外面時,寫法和普通函數一樣,不需要加friend關鍵字,但函數

模板函數

函數 pla tor name urn end per ostream turn friend ostream& operator<< <T>(ostream &out, Complex &c);template <ty

4、【C++】靜態成員變數/靜態成員函式/行內函數/函式//成員函式

一、靜態成員     我們可以使用 static 關鍵字來把類成員定義為靜態的。當我們宣告類的成員為靜態時,這意味著無論建立多少個類的物件,靜態成員都只有一個副本。     靜態成員在類的所有物件中是共享的。如果不存在其他的初始化語句,在建立第一個物件時,所有的靜態資料都會被初始化為

c++之函式

c++友元函式一些見解 1、為什麼要引入友元函式:在實現類之間資料共享時,減少系統開銷,提高效率 具體來說:為了使其他類的成員函式直接訪問該類的私有變數 即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式 優點:能夠提高效率,表達簡單、清晰