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

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

DDD
DDDオリジナル
2024-12-20 10:34:16776ブラウズ

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

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

テンプレート化された親クラスでの変数のアクセス可能性に関する問い合わせに応えて、次のことを明確にすることが不可欠です。バージョン 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 を使用する必要があります。 ;::a' を使用して、継承された変数を明示的に参照します。あるいは、「using」宣言を使用して非修飾名を導入することもできます。

using Foo<T>::a;

int c = a * 4; // Now valid

さらに、基本クラスで宣言された非修飾関数名もこの制限の対象となります。このような関数にアクセスするには、修飾名を使用するか、「using」宣言を行う必要があります。

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

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