GCC によるテンプレート引数の依存関係の厳密な強制
ここに示されているコードは、GCC を使用する場合に発生する問題を引き起こしますが、Visual Studio では発生しません。次のコード:
<code class="cpp">template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } };</code>
は、GCC ではコンパイルに失敗しますが、Visual Studio では正常にコンパイルされます。このエラーにより、開発者はこれを追加するように求められます->
この動作は、GCC が C 仕様に厳密に準拠していることに起因します。 GCC の以前のバージョンでは、テンプレートの基本クラスを解析することによって、テンプレートの基本クラスからメンバー アクセスを推測していました。ただし、ISO C では、この推論には潜在的に問題があるとみなし、非推奨にしました。
このシナリオの解決策は、this-> を使用してメンバー foo を明示的に参照することです。または、次の例に示すように、基本クラスを明示的に指定します。
<code class="cpp">template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << A<T>::foo << endl; } };</code>
これにより、GCC は基本クラスの型を判断し、メンバーのアクセスを適切に解決できます。
以上がGCC がテンプレートの基本クラス メンバーに明示的なメンバー アクセスを必要とするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。