模板技巧性基礎知識

2021-06-08 13:13:47 字數 1534 閱讀 5304

1. 關鍵字typename

template class myclass ;

subtype是定義於類t內部的一種型別。因此ptr是乙個指向t:subtype型別的指標。但是如果缺少typename,subtype就會被認為是乙個靜態成員,那麼它應該是乙個具體的變數或物件,於是,下面表示式:

t::subtype* ptr;

就會被看作是類t的靜態成員subtype和ptr的乘積。

2. 使用this->

對於具有基類的類模板,自身使用名稱x並不一定等同於this->x。即使該x是從基類繼承獲得的,也是如此。

template class base ;

template class derived : public base

};

gcc將無法查詢到a的定義(請注意vc可能編譯通過,在於vc編譯器只掃瞄template一次)。對於那些在基類中宣告,並且依賴於模板引數的符號(函式或變數等),你應該在它們前面使用this->或者base::。

3. 使用字串作為函式模板的實參

有時,將字串傳遞給函式模板的引用引數會導致出人意料的執行結果。

template inline t const& max(t const& a, t const& b)

int main()

template inline t max(t a, t b)

int main()

產生這種呼叫結果的原因在於:對於非引用型別的引數,在實參演繹的過程中,會出現陣列到指標的型別轉換

template void ref(const t& x)

template void nonref(t x)

x in ref(t const&) : char[6]

x in nonref(t): const char*

你可以選擇以下幾種方案:

1) 使用非引用引數,取代引用引數(然而,這會導致無用的拷貝)。

2) 進行過載,編寫接受引用引數和非引用引數的兩個過載引數(然而,這會導致二義性)。

3) 對具體型別進行過載(譬如對std::string進行過載)。

4) 過載陣列型別,譬如:

template t const* max(t const (&a)[n], t const (&b)[m])

5) 強制要求應用程式使用顯式型別轉換。

另外一點要注意的是,無論如何為字串提供過載是有必要的:因為如果不提供過載,當我們呼叫max()來比較兩個字串時,操作a

C Templates 技巧性基礎知識

關鍵字typename 引入關鍵字typename是為了說明 模板內部的識別符號可以是乙個型別 template class myclass template構造 void printbitset std bitsetconst bs template告訴編譯器.template後面的小於號是模板實...

c Templates技巧性基礎知識

include pch.h include include using namespace std class upublic 在類u裡宣告乙個靜態int型別變數 static int sub 無符號整型重定義 typedef unsigned int uint4 uint4 i 類外定義靜態變數 ...

C TEMPLATES學習筆記四 技巧性基礎知識

一 關鍵字typename typename的另乙個用法 告訴編譯器把乙個特殊的名字理解為型別。如下 template class myclass templateclass myclass 沒有typename的版本可以有另一種理解 t類中的subtype成員 與 ptr 相乘。這裡用typena...