コードは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を自由に編集してください。