注4非型テンプレートテンプレートパラメータ

書式#include <文字列>
の#include <iostreamの>
の#include <stdexcept提供>

テンプレート<型名T、INT MAXSIZE>
//テンプレート<型名T = INT、INT MAXSIZE = 100> //可以指定默认值!!!
クラススタック{
プライベート:
T elems [MAXSIZE]。
int型のnumElems個。
公共:
スタック();
空プッシュ(T const&)の
無効ポップ();
Tトップ()constは、
BOOL)(CONST {空
戻りnumElems個== 0。
}
フル()constは{BOOL
戻りnumElems個== MAXSIZEと、
}
}。

テンプレート<型名T、INT MAXSIZE>
スタック<T、MAXSIZE> ::スタック():numElems個(0){}

テンプレート<型名T、int型MAXSIZE>
のボイドスタック<T、MAXSIZE> ::プッシュ(T constの&elemは)
{
場合(numElems個== MAXSIZE)
{
スローのstd :: out_of_range(「スタック<> ::プッシュ():スタックがありますフル");
}
elems [numElems個] = ELEM。
++ numElems個;
}

テンプレート<型名T、int型MAXSIZE>
のボイドスタック<T、MAXSIZE> ::()ポップ
{
場合(numElems個<= 0)
{
スローのstd :: out_of_range( "スタックは、<> ::ポップ():空のスタックを");
}

--numElems;
}


テンプレート<型名T、int型MAXSIZE>
Tスタック<T、MAXSIZE> ::トップ()constは
{
IF(numElems個<= 0)
{
スローのstd :: out_of_range( "スタック<> ::トップ():空のスタック") ;
}
戻りelems [numElems個-1]。
}

)(メインINT
{
{試みる
スタック<整数、20> int20Stack。
スタック<int型、40> int40Stack。
スタック<はstd ::文字列、40> STRINGSTACK。
int20Stack.push(7)。
std :: coutの<< int20Stack.top()<<はstd ::てendl;
int20Stack.pop();
stringStack.push( "こんにちは");
std :: coutの<< stringStack.top()<<はstd ::てendl;
stringStack.pop();
stringStack.pop();
}
キャッチ(スタンダード::例外のconst&EX){
のstd :: CERR << "例外" << ex.what()<<はstd :: ENDL。
EXIT_FAILUREを返します。
}
}

 

テンプレートパラメータの非限定的な種類:(列挙値を含む)なかれ整数とオブジェクトへの外部リンクポインタ。

それは、フロート、およびリンクされたオブジェクトの内部クラスオブジェクトに許可されていません。

悪い例:

テンプレート<文字のconst *名>

クラスMYCLASS {

  ...;

}。

char型のconst * S =「こんにちは「; //グローバルポインタエラーがテンプレートパラメータとして使用することはできません

MYCLASS <S> X; //エラー、リンク・オブジェクト・ポインタが内部を指していますよ

おすすめ

転載: www.cnblogs.com/xpylovely/p/12482571.html