C++初始化类静态成员提示无存储类或类型说明符如何解决
问题原因
类内声明的静态非const、非inline成员仅属于声明,没有分配存储空间也未完成定义,C++语法要求这类成员必须在类外的全局作用域完成一次完整定义。你当前的写法仅为赋值操作,缺少类型声明,编译器无法识别为合法的定义语句,因此抛出「This declaration has no storage class or type specifier」报错。
解决方案
方案1:兼容C++11及更早标准的写法
在你项目中仅编译一次的cpp文件(例如你的main.cpp)中,给静态成员的定义补充完整类型即可:
#include "lib.hpp" // 正确的静态成员定义+初始化写法 LiquidCrystal MainMenuDriver::lcd = LiquidCrystal(8, 9, 4, 5, 6, 7); // 其余静态成员也需要同步完成定义,否则会出现链接错误 std::vector<std::string> MainMenuDriver::menu_items; std::stack<std::string> MainMenuDriver::menu_stack; std::stack<std::string> MainMenuDriver::temp_stack;
该方案不需要创建MainMenuDriver的实例,所有静态成员会在程序启动阶段完成初始化,可直接通过类名调用。
方案2:C++17及以上标准支持的简化写法
如果你的项目允许使用C++17及更高版本标准,可以直接修改lib.hpp中的类声明,给静态成员增加inline修饰符,无需再单独在cpp文件中定义:
class MainMenuDriver { public: // 加inline修饰后可直接在类内完成初始化 static inline LiquidCrystal lcd = LiquidCrystal(8, 9, 4, 5, 6, 7); static inline std::vector<std::string> menu_items; static inline std::stack<std::string> menu_stack; static inline std::stack<std::string> temp_stack; // ... };
内容的提问来源于stack exchange,提问作者user15084242
相关产品推荐
相关产品推荐

