派生クラス内のアクセスできない基本テンプレート クラス識別子: 2 フェーズ ルックアップのケース
テンプレート クラスを使用する場合は、次のことが重要です。 2 フェーズ ルックアップの意味を理解します。 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 識別子を使用しようとするため、エラーが発生します。
この動作は、2 フェーズ ルックアップによって発生します。コンパイルの最初のフェーズでは、コンパイラーは T に実際の型引数を代入せずにテンプレート定義を処理します。その結果、コンパイラーは Base
この問題を解決するには、明示的に指定する必要があります。基本テンプレート クラスから識別子にアクセスするときの基本クラス名。これは、Base
以上が派生テンプレート クラスが基本テンプレート クラスの識別子に直接アクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。