テンプレート化された継承における依存する名前解決
C では、継承された変数にアクセスできるかどうかは、継承のタイプとコンテキストによって異なります。 Bar がテンプレート クラス Foo から継承する次のコードを考えてみましょう:
template<class T> class Foo { ... }; template<class T> class Bar : public Foo<T> { ... };
このシナリオでは、Bar は Foo の保護された変数 a にアクセスできますか?
という疑問が生じます。標準への準拠と根拠
GNU C コンパイラの新しいバージョンは、次のように規定されている C 標準に準拠しています。テンプレート内の非修飾名は依存しません。これは、テンプレートの定義時にこれらの名前を解決する必要があることを意味します。ただし、その時点では依存する基本クラス (Foo) の定義が不明であるため、Bar 内の非修飾名は解決できません。
解決策: 明示的な名前解決
にアクセスするには、Bar はその修飾名 Foo
using Foo<T>::a; int c = a * 4; // Accesses 'a' through namespace resolution
結論として、Bar が Foo から保護された変数 a を継承するのは直感的に見えるかもしれませんが、C 標準ではこれが可能であることのみが規定されています。明示的な名前解決または「using」宣言を通じて。これにより、異なるテンプレートのインスタンス化全体で一貫性があり、明確に定義された動作が確保されます。
以上がテンプレート化されたクラスは、依存する基本クラスから保護されたメンバーをどのように継承してアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。