C では、派生テンプレート クラスが基本テンプレート クラスから継承する場合、派生クラスが期待されるのは自然です。基本クラスの識別子にアクセスできるようになります。ただし、特定のシナリオでは、このアクセスが制限される状況が発生する可能性があります。
次のコードを考えてみましょう:
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(); };
この例では、派生クラスは定義された NO_ZEROFILL 識別子にアクセスできません。基本クラスで。この動作は、C の 2 フェーズ ルックアップ メカニズムによって引き起こされます。
テンプレートの展開中、基本クラス テンプレートは T の特定の型でインスタンス化されます。この場合、コンパイラーは T の実際の型を認識しません。テンプレートが使用されるまでは T です。したがって、NO_ZEROFILL など、T に依存する基本クラスの識別子を解決できません。
この問題に対処するには、識別子にアクセスするときに基本クラス テンプレートを明示的に指定する必要があります。たとえば、単に NO_ZEROFILL ではなく Derived
この明示的な基本クラス テンプレート仕様は、Derived
以上が派生テンプレート クラスがベース テンプレート クラス識別子にアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。