1

コード:

template <class T>
void f(){
T::iterator a; // will work using Gcc if we add typename
//...
}

上記のコードは、MSVC++ を使用すると機能しますが、gcc を使用すると機能しません。MSVC++ は解析を遅らせるためです。
テンプレートの定義時にコンパイラが非依存の名前のルックアップのみを実行することはわかっています。T::iterator明らかに T に依存しているため、テンプレートの定義時にルックアップが行われるのはなぜですか?

4

2 に答える 2

4

そうではありません。依存名は、インスタンス化時に検索されます。定義時には、従属名の構文エラーなどをチェックするだけです。typename キーワードは、コンパイラが式を解析しやすくするために使用されます。

于 2012-08-10T04:16:15.673 に答える
0

キーワードの目的はtypename、コンパイラがルックアップを延期できるようにすることです。したがって、テンプレート定義時に検索が行われないコンテキストでのみ使用されます。

ルックアップは、名前が型であるかオブジェクトであるかを解決します。これは、テンプレート定義の構文をチェックするために必要です。typenameこれを明示的に指定します。キーワードがない場合typename、構文上、コンパイラはそれがオブジェクトであると想定します。

typename依存名に が適用されている場合にのみ、インスタンス化時のルックアップで型を検出する必要があります。

于 2012-08-10T04:31:58.457 に答える