整数定数式でなければなりません。これは、次の標準ドキュメントで説明されています5.19
。
整数定数式には、リテラル (2.13)、定数式 (8.5) で初期化された整数型または列挙型の列挙子、const 変数または静的データ メンバー、整数型または列挙型の非型テンプレート パラメーター、および sizeof 式のみを含めることができます。浮動リテラル (2.13.3) は、整数型または列挙型にキャストされている場合にのみ表示できます。整数型または列挙型への型変換のみを使用できます。
「整数」は「整数」の別の用語ですが、「int」と同じではないことに注意してください。たとえば、「char」には整数/整数型がありますが、明らかに int 型ではありません。したがって、具体的には、次のことが許可されます
10 or 10L or anything like that
enum { THIS, OR, THAT };
int const this_one = 10;
sizeof(char)
- もちろん、上記で詳述した他のテンプレート パラメータ
これらのいずれも、対応する型の整数型を持つパラメーターのテンプレート引数として使用できます。ただし、一部の変換は引き続き適用されます。したがって、int が必要な場合に char を渡すと、自動的に char が int に昇格されます。列挙子を提供し、int が必要な場合も同様です。
したがって、それらのルールによって、もしあなたが持っているなら
extern const int SomeName;
また、その定数を整数定数式で初期化する定義が表示されないため、テンプレート引数として使用できません。もちろん、関数の引数として使用することもできます。これらは型の一部ではないため、コンパイル時に知る必要はありません。テンプレートの特殊化に名前を付けると、使用した引数が型の一部になります。
MyGreatStack<int, 4> // 4 is now part of the type MyGreatStack<int, 4>!
引数として渡す方法は他にもあることに注意してください。SomeName
ただし、これらすべてを整数テンプレート パラメータで受け入れることはできません。たとえば、参照パラメーターによって上記を受け入れることができます
template<const int& V> struct NowItWorks { };
そして、それは上記のを受け入れSomeName
ます。ここでは、値ではなく、プログラム全体で一意の特定の場所 (変数にはextern
リンケージがあるため) が選択されています。