ホームページ  >  記事  >  バックエンド開発  >  基本テンプレート クラスの静的メンバーが派生クラスでアクセスできないのはなぜですか?

基本テンプレート クラスの静的メンバーが派生クラスでアクセスできないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-18 00:34:02577ブラウズ

Why are Static Members of Base Template Classes Inaccessible in Derived Classes?

派生テンプレート クラスのベース テンプレート クラス識別子の可視性

次のコード スニペットを考えてみましょう。

template<typename T>
class Base
{
public:
    static const bool ZEROFILL = true;
    static const bool NO_ZEROFILL = false;
};

template<typename T>
class Derived : public Base<T>
{
public:
    Derived(bool initZero = NO_ZEROFILL);    // NO_ZEROFILL is not visible
    ~Derived();
};

When GCC g 3.4.4 (cygwin) でコンパイルすると、NO_ZEROFILLDerived テンプレート クラスに表示されないため、このコードのコンパイルは失敗します。この動作は、C の 2 フェーズ ルックアップに起因すると考えられます。

C の 2 フェーズ ルックアップ

コンパイラはテンプレート宣言を検出すると、予備的な処理のみを実行します。そのテンプレート内で使用される識別子を検索します。 T の実際の型はこの段階では決定されていないため、コンパイラーはこの型に依存する識別子 (Base::NO_ZEROFILL.

2 フェーズ検索プロセス:

  1. 予備検索: 現在のスコープ内および以前に宣言された名前空間内で識別子が検索されます。
  2. テンプレートのインスタンス化: テンプレートが特定の型パラメーターでインスタンス化されると、インスタンス化されたメンバーと識別子を見つけるために 2 回目の検索が実行されます。
この場合、

NO_ZEROFILLは不明な型 T に依存しているため、予備検索では表示されません。そのため、派生クラスで Base::NO_ZEROFILL または this->NO_ZEROFILL を明示的に指定して、その型が基本クラスのメンバーであることを示す必要があります。テンプレートのインスタンス化時に決定されます。

以上が基本テンプレート クラスの静的メンバーが派生クラスでアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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