テンプレート化された親クラスから継承された変数へのアクセス
テンプレート化された親クラスでの変数のアクセス可能性に関する問い合わせに応えて、次のことを明確にすることが不可欠です。バージョン 3.4.6 以降の最新の GNU C コンパイラーは、C 標準に厳密に準拠しています。テンプレート内の非修飾名は常に非依存であることが規定されています。その結果、提供されたコード スニペットのように、依存する基本クラスの特殊化の性質が不明であるため、テンプレート定義時にこれらの名前を解決することは不可能になります。
template<class T> class Foo { public: Foo() { a = 1; } protected: int a; }; template<class T> class Bar : public Foo<T> { public: Bar() { b = 4; }; int Perna(int u); 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 }
この動作は、定義中に非修飾名を識別する必要があることに起因します。テンプレート定義。将来の特殊化の可能性があるため、依存する基本クラスでは使用できません。したがって、'Bar' の 'Perna' メソッド内で修飾されていない保護された変数 'a' にアクセスしようとすると、エラーが発生します。
この制限を回避するには、修飾名 'Foo
using Foo<T>::a; int c = a * 4; // Now valid
さらに、基本クラスで宣言された非修飾関数名もこの制限の対象となります。このような関数にアクセスするには、修飾名を使用するか、「using」宣言を行う必要があります。
以上がC でテンプレート化された親クラスから継承された変数にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。