模板引數本身也可以是乙個類模板,例如實現乙個stack class。
為了使用其他型別的元素容器,使用者必須兩次指定元素型別:一次是元素型別本身,另一次是容器型別:
stack vstack; //int stack,以vector為容器
如果使用template template parameter,就可以只指明元素型別,無需在指定容器型別:
stack vstack;
為了實現這種特性,你必須把第二個template parameter 宣告為template template parameter.
templateclass cont = std::deque>
class
stack;
其預設值則由std::deque 變更為std::deque。這個引數必須是class template,並以第一引數型別完成例項化:
cont elems;
實際運用時可以使用class template內的任何型別來例項化乙個template template parameter。
通常情況下,可以將class關鍵字改為typename來宣告乙個template parameter;但是 cont定義的是乙個class型別,因此必須使用關鍵字class來宣告它。
所以,以下為正確**:
templateclass cont = std::deque> //ok
class stack{};
而下面的**則是錯誤的:
templateclass cont = std::deque> //ok
class stack{};
所有成員函式也必須按此規則修改:必須指定其第二個template paarmeter為template template parameter。同樣的規則也適用成員函式的實現部分。
注意:模板函式不允許擁有template template parameters。
以下是完整**:
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
template
class cont = std::deque >
class stack
template
class cont2>
stack& operator=(stackconst&);
};template
class cont>
void stack::push(t const& elem)
template
class cont>
void stack::pop()
elems.pop_back();
}template
class cont>
t stack::top()const
return elems.back();
}template
class cont>
template
class cont2>
stack&
stack::operator=(stackconst& op2)
stacktmp(op2);
elems.clear();
while (!tmp.empty())
return *this;
}int main()
catch (std::exception const& ex)
stack vstack;
vstack.push(42);
cout
<< vstack.top()0;}
C語言雙重置換加密
金鑰 置換規則 1,2,3,4,5,6,7,8 2,3,4,5,6,7,8,1 進行行置換,1,2,3,4,5,6,7,8 3,4,5,6,7,8,1,2 進行列置換。include include int main printf 原文是 s s s n yw 0 yw 1 yw 2 char zh...
雙重for迴圈
雙重for迴圈就是在乙個for迴圈裡在巢狀另乙個for迴圈,ji 即兩個迴圈巢狀,還有多重迴圈巢狀的情況,但用的比較少,一般常用的是兩個迴圈巢狀,很少使用多重迴圈,因為for迴圈多了會導致 執行的效率低,而且容易宕機,多迴圈中的總迴圈次數是相乘的,巢狀幾次後幾何級數增長,因此通常情況下在迴圈多次巢狀...
雙重for迴圈
雙重for迴圈 1 概述 很多情況下,單層for迴圈並不能滿足我們的需求,比如我們要列印乙個5行5列的圖形,列印乙個倒直角三角形等,此時就可以通過迴圈巢狀來實現 迴圈巢狀是指在乙個迴圈語句中再定義乙個迴圈語句的語法結構,例如在for迴圈語句中,可以再巢狀乙個for迴圈,這樣的for迴圈語句我們稱之為...