コードはGCCを使用してコンパイルされます。これはVC++でエラーなしで動作します
template <typename T>
void Function(T& A){
T::iterator it; //Error : dependent-name 'T::iterator' is parsed as a non-type,
//but instatiation yields a type.
}
この記事では、コンパイラーは、型のイテレーターがTクラスであるか、単なる静的メンバーであるかを判断できないと述べています。したがってtypename、キーワードを使用してシンボルをタイプとして分類する必要があります。
私の質問は、Tコンパイル時に知られているので、コンパイラiteratorはTの内部がクラス(私の場合はTはvector<int>)であることをすでに知っているということです。では、なぜエラーがあるのでしょうか。
また、これはtypename、テンプレートパラメータの定義として使用する以外のキーワードの別の使用法ですT。
アップデート:
私はここからすべての答えと他の答えを読みました。それは本当に私の考えすべてに答えました。私はそれをこれに要約することができます:
この権利を処理する正しいコンパイラはGccです。VC ++を使用すると、不正な形式のコードをコンパイルできます。Gccでのコンパイル中に発生するエラーは、構文解析によるものです。Gccは関数テンプレートのコードを解析しようとしますがT::iterator it;、Gcc by DeafaultがT::iterator変数として処理するため(T::iterator非タイプ)であり、タイプとしてではなく、この問題を解決するには、GccにT::iteratorタイプとして扱うように明示的に指示する必要があります。これは、キーワードを追加することによって行われtypenameます。
ここでVC++に戻ります。これが機能した理由の答えは、VC ++の既存のバグが原因であり、VC++がかどうかの決定を遅らせるかどうかです。T::iteratorは変数または型です。または、VC ++は、typename必要と思われる場所にキーワードを提供します。
役立つ記事
注:何か間違っていることがわかった場合は、UPDATEを自由に編集してください。