「typename」キーワードはどのような場合に必要ですか? [重複]
次のコードを考えてみましょう:
template<class K> class C { struct P {}; vector<P> vec; void f(); }; template<class K> void C<K>::f() { typename vector<P>::iterator p = vec.begin(); }
この例ではなぜ "typename" キーワードが必要ですか?
答え:
「typename」キーワードは、ネストされた名前を参照する場合に必ず必要です。ネストされた名前の型がコンパイル時に不明なテンプレート クラスまたは関数。これは「依存名」と呼ばれます。
C では、エンティティには値、型、テンプレートの 3 つのカテゴリがあります。これらのそれぞれに名前を付けることができますが、名前自体はエンティティがどのカテゴリに属するかを示しません。したがって、コンパイラはコンテキストからエンティティ カテゴリを推論する必要があります。
コンパイラがカテゴリを推論できない場合は、適切なキーワードを使用してカテゴリを明示的に指定する必要があります:
提供されたコードでは、ネストされた名前「ベクトル
」テンプレート クラス内の型です。ただし、型パラメーター "K" はコンパイル時に不明であるため、コンパイラーはこれを推論できません。したがって、「vector
」を明示的に指定するには、「typename」キーワードが必要です。
「typename」を指定する必要があるその他のケースは次のとおりです。
以上がC テンプレートで「typename」キーワードが必要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。