派生テンプレート クラスのベース テンプレート クラス識別子の可視性
次のコード スニペットを考えてみましょう。
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_ZEROFILL が Derived テンプレート クラスに表示されないため、このコードのコンパイルは失敗します。この動作は、C の 2 フェーズ ルックアップに起因すると考えられます。
C の 2 フェーズ ルックアップ
コンパイラはテンプレート宣言を検出すると、予備的な処理のみを実行します。そのテンプレート内で使用される識別子を検索します。 T の実際の型はこの段階では決定されていないため、コンパイラーはこの型に依存する識別子 (Base
NO_ZEROFILLは不明な型 T に依存しているため、予備検索では表示されません。そのため、派生クラスで Base
以上が基本テンプレート クラスの静的メンバーが派生クラスでアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。