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

DDD
リリース: 2024-11-15 13:53:03
オリジナル
836 人が閲覧しました

Why Can't Derived Template Classes Access Base Template Class Identifiers?

派生テンプレート クラスにおける基本テンプレート クラス識別子のアクセシビリティ

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::NO_ZEROFILL と記述する必要があります。

この明示的な基本クラス テンプレート仕様は、Derived のコンテキスト内で識別子 NO_ZEROFILL を検索するようにコンパイラーに指示します。クラス。これにより、テンプレートの展開時に基本クラス テンプレートが完全にインスタンス化されていなくても、正しい識別子が確実に見つかります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート