テンプレート内の基本クラス メンバーにアクセスすると、GCC が「宣言されていません」エラーをスローするのはなぜですか?

Patricia Arquette
リリース: 2024-11-02 11:15:02
オリジナル
516 人が閲覧しました

Why Does GCC Throw a

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!