問題は、クラステンプレートの特殊化を選択する仕組みが理解できていないことです。
あなたの分業:
template<int J> struct test<int, J> {int j = J;};
は、あなただけの単一のintテンプレートパラメータを渡すために持っているため、テンプレートを作成しません。
test<55> jj; // doesn't work because there's no template<int J> struct test
は、代わりにそれが何template<class T, int I> struct test
にテンプレート引数が専門、すなわちtest<int,J>
と一致するときに使用されるtemplate<class T, int I> struct test
の特殊化を作成することです。
test<int,55> jj; // uses the specialization template<int J> struct test<int, J>
ここでは、標準からキーの引用です:
型の名前のクラステンプレートの特殊化を意味し、(例えば、 A<int, int, 1>
)引数リストは、テンプレートパラメータにの リストと一致するものプライマリテンプレート。 特殊化のテンプレート引数は、プライマリテンプレートの引数から導き出されます。[重点を加え]
- 14.5.5.1 [temp.class.spec.match] P4
あなたが設定しようとしているように見えます
T
のデフォルトタイプとして
int
と同時に、独立した
I
のデフォルト値です。あなたの目的は、型と値を指定し、型だけを指定してデフォルト値として44を取得したり、値を指定してint型をデフォルト型として取得することです。
残念ながら、このような独立したデフォルトを指定する方法はわかりません。デフォルト(template<class T=int, int I=44> struct test
)を指定することもできますが、デフォルトのタイプを取得する場合はデフォルト値を受け入れる必要があります。
しかしあなたは、あなたが行うことができます2番目の名前を使用するために喜んでいる場合:
template <int I>
using test_int = test<int, I>;
これは、あなたが唯一の値を指定する必要があることなど、テンプレートのエイリアスを作成します。
test_int<55> jj;
そして、特定の特殊化があるかどうか、またはコンパイラが暗黙的なものを生成するかどうかを特定するために、test<int, I>
が何らかの特殊化を使用して終了します。
エラーメッセージをリンクできますか? – Morwenn