テンプレートはクラスではありません。は。その名前が意味するように、コンパイラがクラスを作成するのに役立つテンプレートです。つまり、テンプレート クラスがある場合template<typename T> class Foo{};
:
template<typename T>
struct Foo
{
T attribute;
};
Foo
これは、指定された型ごとに異なるバージョンの を生成するためにコンパイラが使用する唯一のテンプレートです。テンプレートをインスタンス化するとき、つまり、指定された型で生成されたクラスが必要であることをコンパイラーに伝えると、コンパイラーはFoo
、テンプレート引数を指定された型に置き換えるコードのバージョンを生成します。
int main()
{
Foo<int> foo_int_variable;
Foo<bool> foo_bool_variable;
}
2 つのインスタンスを確認した後、コンパイラは次のようなコードを生成します。
struct __Foo_int
{
int attribute;
};
struct __Foo_bool
{
bool attribute;
};
したがって、main のコードは次のように変換されます。
int main()
{
__Foo_int foo_int_variable;
__Foo_bool foo_bool_variable;
}
答えは次のとおりです。コンパイラが正しいテンプレートのインスタンス化を生成できるようにするには、必要な型を指定する必要があります。
あなたの例のように、を使用するクラスFoo
が Foo の特定のインスタンス化を必要とせず、汎用バージョンの を必要とするFoo
場合、そのクラスもテンプレートにすることができます。