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
この動作は C 標準 (14.6.2/3) で説明されています。標準によると、「クラス テンプレートまたはクラス テンプレートのメンバーの定義で、クラス テンプレートの基本クラスがテンプレート パラメーターに依存する場合、非修飾名の検索中に基本クラスのスコープは検査されません。」
したがって、派生クラス B では、コンパイラが非修飾名検索の基底クラス スコープを検査しないため、非修飾識別子 Vec_t は認識されません。 typedef に適切にアクセスするには、構文 typename A
以上がC テンプレートの「typedef」型の伝播はベースクラスから派生クラスにどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。