このコード スニペット内:
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 }
GNU C コンパイラの新しいバージョン (例: 3.4) .6 および 4.3.2) を報告します。エラー:
error: `a' was not declared in this scope
Bar 特殊化内の基本クラス Foo の保護された変数 a にアクセスするとき。
新しい GCC バージョンは C 標準に従っています。これは、テンプレート内の非修飾名は非依存であり、テンプレートの定義中に解決する必要があることを指定します。現時点では、依存する基本クラスの定義が不明である可能性があるため、非修飾名は解決できません。
依存する基本クラス内の非修飾の継承メンバーへのアクセスを防止することで、テンプレート明確に定義されており、その専門分野とは独立しています。これにより、テンプレートのセマンティクスがさまざまな特殊化に対して一貫性を保つことが保証されます。
Bar 内で継承された変数にアクセスするには、修飾名を使用できます:
template<class T> int Bar<T>::Perna(int u) { int c = Foo<T>::a * 4; return (Foo<T>::a + b) * u; }
あるいは、using 宣言を使用することもできます。
template<class T> int Bar<T>::Perna(int u) { using Foo<T>::a; int c = a * 4; return (a + b) * u; }
この構文は、コンパイラは、Bar のスコープ内の a が Foo 基本クラスの変数を参照していることを確認します。
以上がC でテンプレート化された親クラスから継承された保護変数にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。