技巧性基礎知識
1. 關鍵字 typename
2.使用this->
3.成員模板
4.模板的模板引數
5.零初始化
6.字串作為函式模板的實參
1. 關鍵字typename
在c++中,引入typename是為了說明:模板內部的識別符號可以是乙個型別。譬如下面:
1 template 2class
myclass ;
上面第三行的typename就是用來說明subtype是個型別,ptr是個指向subtype型別的指標,而不是表示subtype與ptr的乘積。
對於如下示例:
1 template2void printbitset (std::bitsetconst&bs)
在此處,如果不使用.template這個構造,編譯器將不知道bs.template後面的小於號是模板引數列表的起始符號,引起這個的主要原因是傳入引數bs本身依
賴於引數n的構造。
因此,只有當該前面存在依賴於模板引數的物件時,我們需要在模板內部使用.template標記,而此標記也只能在模板內部使用。
2. this->的使用
對於如下示例:
1 #include 23 template 4
class
base 9};
1011 template 12
class derived : base
18};
1920
21int
main ()
很明顯,會輸出:
derived::foo()!
base::exit() !
如果將16行的this->去掉則會輸出:
derived::foo()!
在這個例子中,foo()內部決定呼叫那乙個exit()時,並不會考慮基類base中定義的exit()。因此,如果不加上this->,不是呼叫了乙個錯誤的exit()函式,
就是獲得了乙個編譯錯誤。
因此,對於那些在基類中宣告,並且依賴於模板引數的符號(函式或者變數等),應該在它們前面使用this->或者base::。
3. 成員模板
類的成員也可以是模板,巢狀類和成員函式都可以作為模板。如下示例:
1 template 2class
stack
1314
//使用元素型別為t2的棧進行賦值
15 template //
成員模板
16 stack& operator= (stackconst&);
17};
1819 template 20 template 21 stack& stack::operator= (stackconst&op2)
2526 stacktmp(op2);
2728
elems.clear();
29while (!tmp.empty())
33return *this
;34 };
在上段示例中第15 16行在定義有模板引數t的模板內部,定義了乙個含有模板引數t2的內部模板:
template
template
4. 模板的模板引數
根據名字,我們很容易想到,此處就是說,將乙個模板作為乙個模板引數來使用。示例如下:
template templateclass cont = std::deque >
class
stack ;
在這個例子中,我們使用了第乙個模板引數作為第二個模板引數的例項化型別。一般來說,我們可以使用型別模板內部的任何型別來例項化模板的模板引數。
當第二個模板引數,即模板的模板引數有預設值的時候,會有可能,因為在宣告的時候未指定這個預設值而產生 預設值與模板的模板引數不匹配的錯誤資訊。 因此對於將具有預設值的模板作為模板引數時,可以在使用時指定預設值。
5. 零初始化
在編寫模板時,如果希望模板型別的變數使用預設值初始化,我們需要顯示的呼叫內建型別的預設建構函式,如int()可以獲得預設值 0 。**如下:
1 template 2void
foo ()
6. 使用字串作為函式模板的實參
如下**:
1 template 2 inline t const& max (t const& a, t const&b)56intmain ()
上述的問題在於這些字串屬於不同型別的陣列型別。他們的型別分別是:
"peach" char const[6]
"tomato" char const[7]
s std::string
因此上述呼叫時會出現不同的型別實參從而產生錯誤。
解決的方法是:
1). 對於字串的呼叫,使用非引用引數
2). 進行過載,編寫接受引用引數和非引用引數兩個過載函式 (注意二義性)
3). 對具體型別進行過載 (比如對 std::string 進行過載)。
4). 過載陣列型別,比如:
1 template int n, int m>2 t const * max (t const (&a)[n], t const (&b)[m])
5). 強制要求應用程式設計師使用顯示型別轉換
C Template 讀書筆記 第五章
內容 技巧性基礎知識 關鍵字 typename template this 模板的模板引數 零初始化 字串的模板實參 具體內容描述 1.對模板使用typename 場景 template class test 這裡需要增加typename,需要標記告訴編譯器這個是宣告乙個模板引數型別t裡面的subt...
C template第五章總結
1.如果要訪問依賴於模板內部的型別,前面要加上typename,如 tempateclass my subtype是定義於t內部的型別 2.在多繼承中,要使用this指明要訪問的本成員函式 3.可以過載 讓不同的模板之間可以賦值,但是不會忽略型別檢查 如 stackint1 stackf2 f2 i...
第五周學習筆記
課程位址 第十三講,高斯混合模型 主要內容 值得注意的地方 1.em演算法的收斂 em演算法通過最大化似然函式的下界 使用jesen不等式得到 來近似最大化似然函式,其優化過程相當與對於其下界函式的座標上公升。2.高斯混合模型的優化 q step中的優化是乙個條件極值問題,約束是 j j 1 sig...