テンプレートについては、両方の宣言を見ました:
template < typename T >
template < class T >
違いは何ですか?
では、次の例 (テンプレートに関するドイツ語版 Wikipedia の記事から引用) で、これらのキーワードは具体的に何を意味するのでしょうか?
template < template < typename, typename > class Container, typename Type >
class Example
{
Container< Type, std::allocator < Type > > baz;
};
ベストアンサー1
typename
class
テンプレートを指定する基本的なケースでは、これらは互換性があります。
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 つのキーワードは同等ではなく、どちらか一方を使用する必要がある一般的なケースです。