ホームページ >バックエンド開発 >C++ >C テンプレートの「typedef」型の伝播はベースクラスから派生クラスにどのように機能しますか?

C テンプレートの「typedef」型の伝播はベースクラスから派生クラスにどのように機能しますか?

DDD
DDDオリジナル
2024-12-09 04:31:14856ブラウズ

How Does `typedef` Type Propagation Work from Base to Derived Classes in C   Templates?

テンプレートの基底クラスから派生クラスへの 'typedef' の型伝播

C では、基底クラス内で typedef を定義して、特定のテンプレートに便利なエイリアスを提供することができます。データ型。ただし、テンプレートベースの基本クラスを使用する場合、これらの typedef の派生クラスへの伝播メカニズムを理解することが重要です。

次の例を考えてみましょう。

template<typename T>
class A {
public:
    typedef std::vector<T> Vec_t;
};

template<typename T>
class B : public A<T> {
private:
    Vec_t v; // fails - Vec_t is not recognized
};

ここで、基本クラス A は、型 T のベクトルに対して Vec_t という名前の typedef を定義します。派生クラス B で、Vec_t を完全修飾せずに使用しようとすると (例: typename A::Vec_t) を使用すると、コンパイラでエラーが発生します。

この動作は C 標準 (14.6.2/3) で説明されています。標準によると、「クラス テンプレートまたはクラス テンプレートのメンバーの定義で、クラス テンプレートの基本クラスがテンプレート パラメーターに依存する場合、非修飾名の検索中に基本クラスのスコープは検査されません。」

したがって、派生クラス B では、コンパイラが非修飾名検索の基底クラス スコープを検査しないため、非修飾識別子 Vec_t は認識されません。 typedef に適切にアクセスするには、構文 typename A::Vec_t.

を使用して名前を完全修飾する必要があります。

以上がC テンプレートの「typedef」型の伝播はベースクラスから派生クラスにどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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