C2057构造函数初始化列表中的常量值定义出错
C2057 error on const value definie in constructor inialization list
我有一个C2057错误(在Visual Studio 2010上),我不知道为什么。我知道,要在堆栈上初始化数组,必须在编译时知道大小,这就是为什么需要使用常量值(至少在Visual Studio上是这样,因为不允许像gcc中那样使用可变长度数组)。我的类中有一个const-value成员,我在初始化列表中定义了他的值。所以从技术上讲,这个值在编译时是已知的,对吧?我想知道为什么它不起作用?这里有一个片段:
class Dummy
{
Dummy() : size(4096) {}
void SomeFunction()
{
int array[size]; //return C2057
//...
}
const unsigned int size;
};
感谢
不幸的是,这个常量值不是编译时常量。您需要一个枚举、一个静态积分类型或一个C++11 constexpr
。
另一种选择是将Dummy
作为类模板,采用非类型参数:
template <unsigned int SIZE>
class Dummy
{
void SomeFunction()
{
int array[SIZE];
//...
}
};
size
是常量,但在编译时不知道它是4096。
默认构造函数创建一个大小为4096的Dummy,但谁说Dummy类不是用不同的大小构造的呢?如果有另一个构造函数允许不同的大小,那么编译器不能假设size
总是4096,所以它给出了编译时错误。
您可能不希望所有对象都具有相同值的const数据成员。如果你想在类中嵌套一个符号常量,你有两个选项:
class Dummy
{
// ...
static const unsigned int size = 4096;
enum { another_size = 4096 };
};
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 在定义的函数中使用常量时出错
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- C++ 确保子类为常量提供自定义值
- 用矩阵将函数中的整数值替换定义的常量
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 将字符串文本常量定义为 char const* 和 wchar const*
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 调用构造函数与将内联常量定义为默认参数
- 是否允许在常量定义的对象上丢弃 const 只要它没有实际被修改?
- 多个文件中的常量定义
- 常量定义和模板
- 如何在另一个命名空间中使用常量定义的外部
- 全局常量定义的顺序
- 将常量定义为函数会导致标头=坏主意
- 是一个宏,其变量总是用变量或常量定义