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...