テンプレート化された親クラスの継承された保護された変数へのアクセス
この問題は、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
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 サイトの他の関連記事を参照してください。