如何在C++类中声明const size_t?类内std::array编译报错求助
解决std::array模板参数使用非静态成员变量的编译错误
嘿,这个问题我之前踩过坑!咱们一步步来理清楚问题出在哪,以及怎么修复它。
错误原因
你看到的编译错误核心在于:std::array的第二个模板参数必须是编译期就能确定的常量表达式。而你类里定义的const size_t NCOL = 4是一个非静态成员变量——它属于Test类的每个实例对象,并不是在编译阶段就固定下来的类级常量。哪怕你给它初始化了4,C++标准里非静态的const成员默认也不属于常量表达式范畴,编译器没法在编译时确定它的值,自然没法用来实例化std::array模板。
几种修复方案
我给你列几个常用的解决办法,你可以根据自己的需求选:
1. 将NCOL改为静态const成员
这是最直接的方案,把NCOL声明为static const,这样它就属于类本身,是编译期可确定的常量:
#include <array> #include <iostream> using namespace std; class Test { private: static const size_t NCOL = 4; // 改为静态常量 array<int, NCOL> row; public: Test(){} ~Test(){} }; int main() { Test t; return 0; }
2. 使用C++11及以上的constexpr静态成员
如果你的编译器支持C++11或更高版本,用constexpr会更清晰,它明确告诉编译器这是一个编译期常量:
#include <array> #include <iostream> using namespace std; class Test { private: static constexpr size_t NCOL = 4; array<int, NCOL> row; public: Test(){} ~Test(){} }; int main() { Test t; return 0; }
3. 用枚举类型定义常量
在类里用匿名枚举来定义常量也是个老办法,枚举的成员默认就是编译期常量:
#include <array> #include <iostream> using namespace std; class Test { private: enum { NCOL = 4 }; // 枚举常量,编译期确定 array<int, NCOL> row; public: Test(){} ~Test(){} }; int main() { Test t; return 0; }
内容的提问来源于stack exchange,提问作者Roger_88
相关产品推荐
相关产品推荐

