「typename」と「class」テンプレートパラメータの違いは何ですか? 質問する

「typename」と「class」テンプレートパラメータの違いは何ですか? 質問する

テンプレートについては、両方の宣言を見ました:

template < typename T >
template < class T >

違いは何ですか?

では、次の例 (テンプレートに関するドイツ語版 Wikipedia の記事から引用) で、これらのキーワードは具体的に何を意味するのでしょうか?

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

ベストアンサー1

typenameclassテンプレートを指定する基本的なケースでは、これらは互換性があります。

template<class T>
class Foo
{
};

そして

template<typename T>
class Foo
{
};

同等です。

typenameそうは言っても、との間に違いがある特定のケースがありますclass

最初のものは依存型の場合です。は、次の例typenameのように、別のテンプレート パラメーターに依存するネストされた型を参照するときに宣言するために使用されます。typedef

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

2 番目は、気付いていないかもしれませんが、質問の中で実際に示されています。

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

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

classテンプレートを明示的にインスタンス化する場合も、以下を使用する必要があります。

template class Foo<int>;

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

おすすめ記事