C 中的類模板應用問題

2021-04-21 08:16:26 字數 1707 閱讀 5199

在c++中,類模板的使用有一些特殊的問題,大家都知道,c++中類的出現是為了實現封裝,達到資訊的隱藏,很多時候,類的宣告和實現細節是分到不同的檔案進行編寫的,但是在模板中,因為一些特殊的原因(對模板引數無法分辨),必須要將兩部分寫道同乙個檔案中,並且,因為模板的複雜性,其默寫特殊形式的宣告也比較特別。下例為網上摘錄的乙個片段(其中做了部分修改,另,因為記不得準確的出處,所以不知道該怎麼宣告,還請原作者見諒),

//#include

#include

using namespace std;

#if 0

template

class box;

template

boxoperator+ (const box&, const box&);

template

boxoperator+ (const box&, const t &);

template

boxoperator+ (const t &, const box&);

template

ostream& operator<< (ostream &, const box&);

#endif   // end #if 0

template

class box;

#if 1

template

void box::sta()

template

box::box(const t& newt)

template

void box::f()

template

void box::f(t &a)

template

boxoperator + (const box&a, const t &b)

template

boxoperator+ (const t &a, const box&b)

template

boxoperator+ (const box&a, const box&b)

template

ostream & operator << (ostream &os, const box&a)

#endif   // end #if

對於這段**,有如下幾點需要注意:

第一,友元函式的宣告形式。因為其形式同樣為模板函式,也就是標準中的成員函式模板(可能有些編譯器不支援這個特性),在宣告的時候必須加上關鍵字template ,如果不加上的話,在vc6.0中會提示你無法訪問private變數,在vs2005中會提示鏈結錯誤,即使你將其中的private member data變成了public,在vc6.0中通過,也按你的預期執行了(雖然我認為其中還應該有些問題,甚至有可能是你宣告的友元根本就沒有當作友元,或者說你宣告的友元並沒有真正的實現,你真正實現的似乎是同名的函式是乙個全域性的函式,那麼他就可以訪問你的被改為public的資料成員,達到你想要的結果,但執行的不是你的友元函式,而是乙個全域性的函式模板),但是在vs2005中依然鏈結錯誤,所以,關鍵字template 一定要加上--雖然有點麻煩:)

第二,關於類模板中建構函式。正確形式如下:

template

box::box()

寫成如下的形式會發出乙個警告,這可不是什麼好兆頭。它說明你為每乙個例項化的類都編寫了特定的建構函式,或者說,你寫的建構函式只是為特定類實現的,你真的需要這麼做麼?

template

box::box()

C 中的模板(類模板 模板類 模板函式)

1 class 一般class用於定義類,在模板引入c 後,最初定義模板的方法為 template,這裡class關鍵字表明t是乙個型別 2 typename 為了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號為乙個型別...

c 中的類模板

類模板和類的概念類似之處,類是把具體物件 具有相同的屬性 抽象化,類模板是把資料型別抽象化。這樣使用類模板,我們就不必因為資料型別的微小變化而每次都定義不同的類,避免了類的重複設計。class a int getval private int val class b double getval pr...

C 中的 類模板

具體example如下 template class queue private node head int thesize public queue queue void push t val while temp next null if temp next null void print co...