巢狀過載以及模板特化

2021-07-06 01:42:38 字數 2278 閱讀 7719

我在用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 給出特定型別下的函式模板定義,表明它是乙個沒...