GCC の落とし穴: テンプレート引数の依存関係を持つ基本クラス メンバーへのアクセス
このコードは、GCC では不可解なコンパイル エラーを示しますが、Visual Studio では成功します。
template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } };
GCC は、基本クラスのメンバーであるにもかかわらず、「foo' はこのスコープで宣言されていません」というエラーを発生させます。ただし、「this->foo」を介して基本クラスのメンバーを明示的に参照するようにコードを変更すると、問題は解決します。
説明
GCC は C 標準に従っています。テンプレートのコンパイル中に基本クラスのメンバーの推論を禁止します。以前のバージョンでは、GCC は基本クラスを解析することによってメンバーを推論していましたが、これにより競合が発生する可能性がありました。
これを解決するには、テンプレート内で基本クラスのメンバーに明示的にアクセスできるようにします:
「this」を使用してメンバーを参照します:
void bar() { cout << this->foo << endl; }
基本クラス名を指定します:
void bar() { cout << A<T>::foo << endl; }
に従うこれらのガイドラインに従って、開発者はコンパイル エラーを防止し、GCC がテンプレート内で意図したとおりに基本クラスのメンバー アクセスを処理することを保証できます。詳細については、GCC マニュアルを参照してください。
以上がテンプレート内の基本クラス メンバーにアクセスすると、GCC が「宣言されていません」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。