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

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

DDD
リリース: 2024-11-16 03:01:02
オリジナル
882 人が閲覧しました

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

派生テンプレート クラスがベース テンプレート クラス識別子にアクセスできなくなる理由

C では、派生テンプレート クラスが識別子に直接アクセスできない場合があります。その基本テンプレート クラスの。 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();
}
ログイン後にコピー

この例では、派生クラス Derived は、基本クラス Base の NO_ZEROFILL 識別子。これは、テンプレート定義フェーズ中に、コンパイラーが T に代わる実際の型を持たないためです。したがって、コンパイラーは、Base で定義された識別子を解決できません。

この動作により、クラスが異なる型でインスタンス化される場合でも、テンプレート クラス内の識別子の意味が明確に定義されます。 Base の各インスタンス化は、には独自の静的メンバー「ZEROFILL」と「NO_ZEROFILL」のセットがあり、コンパイラーはテンプレートが特定の型引数でインスタンス化される場合にのみコードの有効性を検証します。

提供されたコードの問題を解決するには、次のようにします。以下に示すように、NO_ZEROFILL 識別子を基本クラス名で明示的に修飾できます。

Derived( bool initZero = Base<T>::NO_ZEROFILL );
ログイン後にコピー

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

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