[解決済み] テンプレートにおける'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;
};
解決方法は?
typename
と
class
は、テンプレートを指定する基本的な場合、互換性があります。
template<class T>
class Foo
{
};
そして
template<typename T>
class Foo
{
};
は等価です。
とはいえ、具体的なケースとして
typename
と
class
.
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つのキーワードは同等ではなく、どちらかを使わなければならない一般的なケースをいくつか挙げました。
関連
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] テンプレートのパラメータに 'class' または 'typename' を使用しますか?重複