C++含static std::vector成员的Shape类链接错误问题求解
错误产生原因
C++语法规则要求:类内声明的非inline静态成员变量,仅属于声明范畴,不会实际分配存储空间。必须在类外部的全局/对应命名空间作用域下单独做一次定义性声明,编译器才会为该静态变量分配实际内存。
你当前代码仅在Shape类内部声明了静态成员_shapes,没有做类外的定义,链接阶段程序找不到该变量的实际内存地址,就会触发未定义引用的链接错误。
解决方法
提供两种可选方案:
- 方案1(兼容所有C++标准):在Shape类对应的源文件中,补充静态成员的外部定义
修改后的源文件完整代码如下:
#include "Shape.h" // 补充Shape类静态成员_shapes的定义 std::vector<Shape*> Shape::_shapes; void Shape::test_shapes() { _shapes.size(); }
- 方案2(仅支持C++17及更高版本):直接修改头文件中静态成员的声明,增加
inline关键字,无需额外在类外定义
修改后的头文件对应代码行:
inline static std::vector<Shape*> _shapes;
内容的提问来源于stack exchange,提问作者reem_mikulsky
相关产品推荐
相关产品推荐

