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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-30 05:30:10955ブラウズ

How Can I Access Inherited Protected Variables from a Templated Parent Class in 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
}

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。