派生类的模板类型定义
在 C 中,模板允许定义泛型类和数据结构。但是,将 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; // Error: Vec_t is not recognized };
在此示例中,类 A 为 T 类型的向量定义了 typedef。 ,当尝试在派生类 B 中使用此 typedef 时,会发生错误,因为 B 的作用域内无法识别 Vec_t。
原因这个问题源于 C 标准对模板基类范围的处理。根据标准第 14.6.2/3 节:
“在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在非限定名称查找期间不会检查基类作用域...”
这意味着在使用非限定名称时,基类中定义的 typedef 不会自动在派生类的作用域中可用。要解决此问题,typedef 必须是完全限定的:
typename A<T>::Vec_t v;
通过使用 typename 关键字后跟 typedef 的完全限定名称,您可以显式指定要使用基类中的 typedef 。这将按预期工作,并允许您访问派生类中的向量 typedef。
以上是如何在 C 中访问派生类模板中的基类 Typedef?的详细内容。更多信息请关注PHP中文网其他相关文章!