ホームページ > バックエンド開発 > C++ > C のテンプレート化された親クラスで保護された継承変数にアクセスするにはどうすればよいですか?

C のテンプレート化された親クラスで保護された継承変数にアクセスするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-10 07:56:12
オリジナル
442 人が閲覧しました

How Can I Access Protected Inherited Variables in Templated Parent Classes in C  ?

テンプレート化された親クラスの継承された保護された変数へのアクセス

この問題は、C のテンプレート化された親クラスから保護された継承された変数にアクセスしようとすると発生します。次の C コードを考えてみましょう:

template<class T> class Foo {
    protected:
        int a;
};

template<class T> class Bar : public Foo<T> {
    protected:
        int b;
};

template<class T> int Bar<T>::Perna(int u) {
    int c = Foo<T>::a * 4; // This works
    return (a + b) * u;    // This doesn't
}
ログイン後にコピー

この場合、GCC バージョン 3.4.6 以降では、継承された Foo クラスの保護された変数 a にアクセスしようとするとエラーが発生します。 GCC 2.96 や MSVC 6-9 などの古いコンパイラでは、問題なくこのアクセスが許可されます。

エラーの説明

このエラーは、C 標準によれば、修飾されていないために発生します。テンプレート内の名前は、テンプレートの定義中に検索する必要があります。ただし、依存する基本クラス (この場合は Foo など) の定義は、テンプレート定義時には不明な場合があります。この不確実性により、非修飾名の解決が妨げられます。

標準準拠

GCC 3.4.6 以降のバージョンで示される動作は、C 標準に準拠しています。標準に準拠することで、これらのコンパイラは、コードの正確性と動作が異なるプラットフォームやコンパイラ間で一貫していることを保証します。

解決策

この問題を解決し、保護された継承されたファイルにアクセスするには変数を使用する場合、変数の修飾名 (例: Foo::a) を使用するか、「using」宣言を利用することができます。例:

template<class T>
int Bar<T>::Perna(int u) {
    int c = this->a * 4; // Access using the qualified name
    c = a * 4;          // Access using the "using" declaration
}
ログイン後にコピー

この変更されたコードでは、修飾名または "using" 宣言で変数のソースを明示的に指定し、コンパイラーがそれを正しく解決できるようにします。

以上がC のテンプレート化された親クラスで保護された継承変数にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート