如何声明静态常量数组?类public域定义static const string数组报E1591错误
E1591报错解决方法
报错根因
C++标准规定,类作用域内仅允许为整型、枚举类型的静态常量提供内联初始化。你定义的
std::string类型静态数组属于非整型静态成员,在类内写初始化语句仅完成符号声明,不会生成可被链接器识别的实体定义,因此触发E1591报错。
可落地解决选项
- 方案1:拆分类内声明、类外定义(兼容所有C++版本)
- 将类public域内的代码修改为仅做静态成员声明,去掉初始化内容:
class YourClass { public: static const std::string brands[]; }; - 在类对应的源文件(.cpp)全局作用域下,完成静态成员的实际定义与初始化:
const std::string YourClass::brands[] = {"Coca-Cola","Pepsi","Ruffles"};
- 将类public域内的代码修改为仅做静态成员声明,去掉初始化内容:
- 方案2:C++17及以上版本直接使用内联静态成员
给静态成员加上inline关键字,即可直接在类作用域完成初始化,不需要拆分到类外写定义:class YourClass { public: static inline const std::string brands[] = {"Coca-Cola","Pepsi","Ruffles"}; }; - 方案3:兼容旧标准的替代写法
如果项目没有升级C++版本的计划,可以把数组元素类型从std::string换成带const修饰的字符串指针,这类类型满足类内静态常量的编译期要求,不会触发报错:class YourClass { public: static const char* const brands[] = {"Coca-Cola","Pepsi","Ruffles"}; };
内容的提问来源于stack exchange,提问作者tbpaksoy
相关产品推荐
相关产品推荐

