C++编译报only static data member templates are allowed错误排查
错误原因
- 该编译错误是违反C语法规则导致的:C标准明确规定模板数据成员只能是静态成员,不支持非静态的模板数据成员。你在
Component类中定义的template <typename T> T* ptr_;属于非静态成员,不符合语法要求,因此编译器抛出C3376错误。 - 补充说明:非静态数据成员是每个类实例独立持有的属性,而模板成员需要根据传入的类型参数实例化出不同的成员,C++目前没有支持“每个实例可持有任意类型模板成员变量”的设计,只有属于类本身、而非实例的静态模板数据成员才是合法的。
参考修复方案
如果你的需求是让每个子类实例可以保存指向自身类型的指针,可以选择以下两种修改方式:
- 采用CRTP(奇异递归模板模式),将Component改为类模板
// component.h template <typename T> class Component { public: T* ptr_; };
// transform.h class Transform : public Component<Transform> { public: Transform(); };
// transform.cc Transform::Transform() { ptr_ = this; }
- 改用基类指针存储,使用时再做类型转换
// component.h class Component { public: Component* ptr_; };
// transform.h class Transform : public Component { public: Transform(); };
// transform.cc Transform::Transform() { ptr_ = this; } // 需要获取Transform类型指针时,使用static_cast转换即可:static_cast<Transform*>(ptr_)
内容的提问来源于stack exchange,提问作者Emirhan Yılmaz
相关产品推荐
相关产品推荐

