一:關鍵字typename
typename的另乙個用法: 告訴編譯器把乙個特殊的名字理解為型別。
如下:
template class myclass ;
templateclass myclass ;
沒有typename的版本可以有另一種理解: t類中的subtype成員 與 ptr 相乘。
這裡用typename 宣告 subtype是一種型別而不是變數。
二: .template構造
例如:
template void printbitset(std::bitsetconst& bs)
在這種情況下 bs是依賴於模板的構造 如果不顯示宣告.template 編譯器將不知道 後面的《符號意義 (模板或者是小於號)
三:使用this->
template class base ;
template class derived : base
};
通過顯式使用this-> 或者 base::來避免不確定性。
四:成員模板
之前說過的不同型別的棧不能相互賦值因為預設的賦值函式要求兩邊的型別一樣。
既然這樣我們可以強行定義模板的賦值運算子實現不同元素型別模板之間的賦值。
例如:
templateclass stack
// template stack& operator= (stackconst&);
};templatetemplatestack& stack::operator = (stackconst& op2)
stacktmp(op2);
elems.clear();
while (!tmp.empty())
return *this;
};
五:模板的模板引數
例如:
templateclass cont = std::deque >
class stack
};
注:
1.這裡的class是為了定義乙個類 不能用typename替換
2.函式模板不支援模板的模板引數
六:零初始化
模板中型別初始化
template void foo()
template class myclass
};
七:使用字串作為函式模板的實參
字串傳遞給函式模板的引用引數的一些問題,如下:
#include template inline t const& max(t const& a, t const& b)
int main()
乙個是const char[6]型別 乙個是const char[7]型別
如果是非引用引數,則可以使用長度不同的字串作為max()的引數。
因為對於非引用引數,在實參演繹的過程中,會出現陣列到指標的轉換。
C Templates學習筆記(類模板)
類模板stack 是通過c 標準庫的類模板vector 來實現的,因此不需要自己實現記憶體管理 拷貝建構函式和賦值運算子。標頭檔案宣告 include include using namespace std template class stack 成員函式的實現 template void sta...
C Templates學習筆記 例項化
一 on demand例項化 有時候也被稱為隱式例項化或者自動例項化。on demand例項化表明 在使用模板 特化 的地方,編譯器通常需要訪問模板和某些模板成員的整個定義。例子 templateclass c 前置宣告 c p 0 正確,因為這裡不需要知道c的定義 template class c...
C Templates學習筆記二 類模板
一 類模板的實現 例項 include include template 類模板宣告部分 同樣可以使用class t為模板引數 class stack template void stack push t const elem templatevoid stack pop elems.pop bac...