重複の可能性あり:
「typename」と「class」テンプレートパラメータの違いは何ですか?
C++ で関数テンプレートまたはクラス テンプレートを定義するときは、次のように記述できます。
template <class T> ...
または、次のように書くこともできます:
template <typename T> ...
どちらか一方を他方より優先する正当な理由はあるでしょうか?
私は最も人気がある(そして興味深い)答えを受け入れましたが、本当の答えは「いいえ、どちらか一方を他方より好む十分な理由はありません」であるようです。
- これらは同等です (以下に記載されている場合を除く)。
- 常に を使用する理由がある人もいます
typename
。 - 常に を使用する理由がある人もいます
class
。 - 両方を使用する理由がある人もいます。
- どちらを使うかは気にしない人もいます。
ただし、C++17より前のテンプレートテンプレートパラメータの場合、class
の代わりにを使用するtypename
必要がありました。user1428839 の回答以下に説明します。(ただし、この特定のケースは好みの問題ではなく、言語の要件でした。)
ベストアンサー1
スタン・リップマンはこれについて語ったここ面白いと思いました。
概要: Stroustrup は当初、class
新しいキーワードの導入を避けるためにテンプレートで型を指定していました。委員会の一部のメンバーは、このキーワードのオーバーロードが混乱を招くことを懸念していました。その後、委員会は構文のtypename
曖昧さを解決するために新しいキーワードを導入し、混乱を減らすためにテンプレートの型を指定するためにも使用できるようにすることを決定しましたが、下位互換性のためにclass
オーバーロードの意味はそのまま残しました。