關鍵字typename:
引入關鍵字typename是為了說明:模板內部的識別符號可以是乙個型別:
template
class myclass
.template構造:
void printbitset (std::bitsetconst& bs)
.template告訴編譯器.template後面的小於號是模板實參列表的起始符號。
使用this->:
對於那些在基類中宣告,並且依賴於模板引數的符號(函式或變數等),應該在它們前面使用this->或者base::。
如果希望完全避免不確定性,可以限定模板中所有的成員訪問。
成員模板和模板的模板引數:
通常,棧之間只有在型別完全相同時才能相互賦值,其中型別指的是元素的型別,即使這兩種元素的型別之間存在隱式型別轉換。『
函式模板不支援模板的模板引數。
不同型別間賦值的解決辦法(並加入模板的模板引數的完整版):
code:
#include
#include
#include
template
template
class cont = std::deque> //模板的模板引數,其中類的兩個模板引數是為了匹配std::deque的兩個模板實參預設模板引數(元素型別和記憶體分配器allocator)
class stack
//在元素不同的棧之間相互賦值的過載operator=
template
template
class cont2>
stack& operator= (stackconst&);
};
template
class cont>
void stack::push (t const& elem)
template
class cont>
void stack::pop ()
elems.pop_back(); // remove last element
} template
class cont>
t stack::top () const
return elems.back(); // return copy of last element
} //在元素不同的棧之間相互賦值的過載operator=
template
class cont>
template
class cont2>
stack& stack::operator= (stackconst& op2)
stacktmp(op2); // 建立乙份賦值棧的拷貝,以便使用top()和pop()從該拷貝中獲取元素。
elems.clear(); // 移除現有元素
while (!tmp.empty())
return *this;
}
零初始化:
對於int、double或者指標等基本型別,應該顯式地呼叫內建型別的預設建構函式,並把預設值設為0(或者false,對於bool型別而言)。比如呼叫int()我們就將獲得預設值0。
template
void foo()
對於類模板,需要定義乙個預設建構函式,通過乙個初始化列表來初始化類模板的成員。
template
class myclass ;
使用字串作為函式模板的實參:
如果把字串傳遞給函式模板的引用引數時,由於長度的區別,長度不同的字串屬於不同的陣列型別,可以通過傳遞給非引用型別的引數來解決這個問題,但對於非引用型別的引數,在實參演繹的過程中,會出現陣列到指標的型別轉換。
根據不同的情況,對此類問題的解決方法:
template
t const* max(t const (&a)[n], t const (&b)[m])
小結:
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...
模板技巧性基礎知識
1.關鍵字typename template class myclass subtype是定義於類t內部的一種型別。因此ptr是乙個指向t subtype型別的指標。但是如果缺少typename,subtype就會被認為是乙個靜態成員,那麼它應該是乙個具體的變數或物件,於是,下面表示式 t subt...