我在用c++實現乙個鏈式棧的時候,想利用其特性實現乙個」簡單「 << 的過載,卻不料這個過載卻是如此的艱辛,我用的是vs2013,編譯器一直出現鏈結錯誤,我檢查了好久,認為沒有錯誤,而其中大有文章。
**如下:
#pragma once
#include #include #include using namespace std;
templateclass stack;
//template//class listnode;
//template//ostream& operator<<(ostream& ou, listnode& r);
templateclass listnode
listnode(type d, listnode* next = null) :data(d), link(next)
{} ~listnode()
{} friend ostream& operator<< (ostream& ou, listnode& r);
friend ostream& operator<< (ostream& out, stack& r);
private:
type data;
listnode* link;
};//template//ostream& operator<<(ostream& out, stack& r);
templateclass stack
~stack()
public:
bool empty()
void push(type x)
else
}/*void show()
else
}cout << endl;
}*/void pop()
else
}void pop(type& e)
else
}type gettop()
int length()
else
}return count;
} void destroy()
else
}} friend ostream& operator<< (ostream& out, stack& r);
private:
listnode* top;
};templateostream& operator<<(ostream& ou, listnode& r)
templateostream& operator<<(ostream& out, stack& r)
out << "base";
out << endl;
return out;
}
測試**如下:
#define _crt_secure_no_warnings
#include "stack.h"
int main()
我剛剛開始的時候兩個友元函式是這樣定義的:
friend ostream& operator<<(ostream& ou, listnode& r);
friend ostream& operator<<(ostream& out, stack& r);
這樣也算合情合理吧,可是執行起來卻總是出現鏈結錯誤,找了很久很久沒有發現。
我看了c++primer上講述的,意思是乙個友元函式若是要被乙個類的物件所使用,必須提前宣告它,所以我提前定義了,但最後證明不是主要原因。實際上我在**中注釋的那些都跟編譯器有關,在vs2013下不需要(但加上並沒有錯),但是在linux平台下是必須要的。
最終問題出現在沒有特化,正確的做法是類裡面宣告時候寫成 friend ostream& operator<< (ostream& ou, listnode& r);
friend ostream& operator<< (ostream& out, stack& r);
因為友元函式並不是類的成員,所以需要特化為,否則會產生鏈結錯誤,即找不到過載的《符號。
最後,我覺得我們在以後的程式設計中,可以把listnode類的成員全部設為共有,這樣有利於對其中的資料的訪問,而且不需要許多複雜的處理,在上面例子中,為了訪問listnode的資料,宣告了stackwei其友元類,而且在其中宣告了 friend ostream& operator<< (ostream& out, stack& r);,若將listnode暴露出來則沒有這些複雜的處理。而主要類stack封裝起來,這樣實現方法照樣可以得到很好的保護。
模板函式 過載 特化
見 12 3456 78910 1112 1314 1516 1718 1920 2122 2324 2526 2728 2930 3132 3334 3536 3738 3940 4142 4344 4546 4748 4950 5152 5354 5556 5758 5960 6162 6364...
模板特化以及模板分離操作
一 模板特化。一 函式模板的特化 函式模板的特化步驟 必須要先有乙個基礎的函式模板 關鍵字template後面接一對空的尖括號 函式名後跟一對尖括號,尖括號中指定需要特化的型別 函式形參表 必須要和模板函式的基礎引數型別完全相同,如果不同編譯器可能會報錯。include include using ...
模板完全特化,函式過載的過載,類模板的繼承
模板完全特化,函式過載的過載,類模板的繼承 模板用於對類或函式的定製。當模板的泛化處理不適合某個特定的資料型別時,可針對這個資料型別給出相應的模板,包括函式模板和類模板。1 函式模板完全特化 函式模板完全特化是在函式模板定義後,再用關鍵字template 給出特定型別下的函式模板定義,表明它是乙個沒...