Foo
2つ(またはそれ以上)のテンプレート引数を取るテンプレートクラスがあります。その型を別のクラスで使用したいBar
。エラーなしでコンパイルされる次の簡単な例を参照してください。
template <typename T, typename U> class Foo { };
template <typename T, typename U> class Bar { };
int main()
{
Bar<int, char> bar; // quick example -- int & char could be any 2 types
return 0;
}
上記は、特にFoo
多くのテンプレート引数を取り、プログラマーがそれらすべてを再入力する必要がある場合は、やや面倒です。代わりに次のようなものが欲しいのですが、コンパイルされません:
template <typename T, typename U> class Foo { };
template <typename T, typename U> class Bar; // base
template <typename T, typename U> class Bar< Foo<T, U> > { }; // specialization
int main()
{
typedef Foo<int, char> FooType;
Bar<FooType> bar;
return 0;
}
test.cpp:3:60:エラー:テンプレート引数の数が間違っています(1、2である必要があります) test.cpp:2:45:エラー:「テンプレートクラスバー」に提供 test.cpp:関数内'int main()': test.cpp:7:18:エラー:テンプレート引数の数が間違っています(1、2である必要があります) test.cpp:2:45:エラー:「テンプレートクラスバー」に提供 test.cpp:7:23:エラー:';'の前の宣言に無効なタイプがあります トークン
この部分的な特殊化のイディオムは単一のテンプレート引数に対して正常に機能するため、私は特に困惑しています。「テンプレートのクラス全体の専門化」というタイトルの質問を参照してください。
編集少なくとも私の目的では、次のようにC++11可変個引数テンプレートを使用してこれを回避できることに気付きました。ただし、2番目の例が機能しない理由を知りたいのですが。
template <typename... FooTypes> class Bar;
template <typename... FooTypes> class Bar< Foo<FooTypes...> > { };