1. ホーム
  2. c++

[解決済み] テンプレートにおける'typename'と'class'の違い?

2022-02-24 21:06:46

質問

テンプレートについて、両方の宣言を見たことがあります。

template < typename T >
template < class T >

何が違うの?

そして、これらのキーワードは、次の例(ドイツ語のWikipediaのテンプレートに関する記事から引用)では、具体的にどのような意味を持つのでしょうか。

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};

解決方法は?

typenameclass は、テンプレートを指定する基本的な場合、互換性があります。

template<class T>
class Foo
{
};

そして

template<typename T>
class Foo
{
};

は等価です。

とはいえ、具体的なケースとして typenameclass .

1つ目は、従属型の場合です。 typename は、他のテンプレート・パラメータに依存するネストされた型を参照するときに宣言するために使用され、例えば typedef この例では

template<typename param_t>
class Foo
{
    typedef typename param_t::baz sub_t;
};

2つ目は、ご本人は気づいていないかもしれませんが、実際にご質問の中で示されているものです。

template < template < typename, typename > class Container, typename Type >

を指定した場合 テンプレートテンプレート を指定すると class キーワードは上記のように使用しなければなりません。 ではない と互換性があります。 typename この場合 (注: C++17 以降では、この場合両方のキーワードが許可されます) .

また class は、明示的にテンプレートをインスタンス化するときに使用します。

template class Foo<int>;

この他にも、私が見逃しているケースがあると思いますが、要するに、この2つのキーワードは同等ではなく、どちらかを使わなければならない一般的なケースをいくつか挙げました。