将类的静态const数据成员用作同类成员数组大小报错如何解决
报错原因
C++要求类内声明栈数组时,数组长度必须是编译期可确定的整型常量表达式。你当前的写法仅在类内声明了static const int LIST_SIZE,初始化赋值放在了类外,编译器解析类定义时无法拿到它的具体值,因此判定数组长度非法。
解决方案
- 方案1:兼容C++98及以上所有标准的写法
直接在类内声明静态const整型成员时完成初始化,类外的定义可根据实际需求决定是否保留:如果后续需要对LIST_SIZE取地址、绑定左值引用,保留无赋值的类外定义即可,否则可以直接删除。
修改后的核心代码如下:class List { public : List() ; //createList void insert(int x , int listIndex) ; void removeIndex(int listIndex) ; //index based remove void removeValue(int listValue) ; //value based remove void removeAll() ; int find(int x) ; void copy(List *listToCopy) ; void update(int x , int index) ; bool isEmpty() ; bool isFull() ; int get(int index) ; int sizeOfList() ; void printList() ; private : //int translate ( int position ) ; // 类内直接初始化静态const整型成员 static const int LIST_SIZE = 5 ; int items[LIST_SIZE] ; int current ; int size ; } ; // 仅需要对LIST_SIZE取地址时保留这行,不需要赋值 // const int List::LIST_SIZE; - 方案2:C++11及以上标准推荐写法
用constexpr修饰静态成员,明确标识为编译期常量,语义更清晰:// 类内声明修改为 static constexpr int LIST_SIZE = 5; - 方案3:需要灵活定义不同大小List的场景
可以将List改造为类模板,把数组长度作为模板参数传入,实现不同大小的List实例复用同一套逻辑:template <int Size> class List { // 原有成员逻辑不变,仅修改items数组声明 private: int items[Size]; // 其余成员不变 }; // 实例化方式 List<5> myList;
内容的提问来源于stack exchange,提问作者SANG
相关产品推荐
相关产品推荐

