ホームページ >バックエンド開発 >C++ >派生テンプレート クラスが基本テンプレート クラスの識別子に直接アクセスできないのはなぜですか?

派生テンプレート クラスが基本テンプレート クラスの識別子に直接アクセスできないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-17 02:46:03932ブラウズ

Why Can't Derived Template Classes Directly Access Identifiers from Base Template Classes?

派生クラス内のアクセスできない基本テンプレート クラス識別子: 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 内の特定の識別子の存在を判断できません。第 2 フェーズでのみ、テンプレートが特定の型 (Derived など) に対してインスタンス化されるとき、コンパイラーは識別子を解決してその存在を確認できます。

この問題を解決するには、明示的に指定する必要があります。基本テンプレート クラスから識別子にアクセスするときの基本クラス名。これは、Base::NO_ZEROFILL または this->NO_ZEROFILL を使用して実行できます。ここで、this は派生クラスのインスタンスを参照します。そうすることで、識別子が基本クラスで定義されており、テンプレートのインスタンス化中に解決される必要があることをコンパイラーに通知します。

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

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