1

我遇到 C2057 错误(在 Visual Studio 2010 上),我不知道为什么。我知道要初始化堆栈上的数组,必须在编译时知道大小,这就是为什么需要使用 const 值的原因(至少在 Visual Studio 上,因为在 gcc 中不允许使用可变长度数组)。我的班级中有一个 const value 成员,我在初始化列表中定义了他的值。所以从技术上讲,这个值在编译时是已知的,对吧?我想了解为什么它不起作用?这是一个片段:

class Dummy
{
    Dummy() : size(4096) {}

    void SomeFunction()
    {
        int array[size]; //return C2057 
        //...
    }

    const unsigned int size;
};

谢谢

4

3 回答 3

7

不幸的是,这个 const 值不是编译时常数。您需要一个枚举、一个静态整数类型或一个 C++11 constexpr

另一种选择是制作Dummy一个类模板,采用非类型参数:

template <unsigned int SIZE>
class Dummy
{
    void SomeFunction()
    {
        int array[SIZE];
        //...
    }
};
于 2012-08-01T18:58:29.993 回答
5

size是 const,但在编译时不知道是 4096。

默认构造函数创建一个大小为 4096 的 Dummy,但谁说 Dummy 类不是用不同大小构造的?如果有另一个构造函数允许不同的大小,那么编译器不能假设它size总是 4096,所以它会给出编译时错误。

于 2012-08-01T18:57:33.427 回答
2

对所有对象都具有相同值的 const 数据成员可能不是您想要的。如果你想在一个类中嵌套一个符号常量,你有两个选择:

class Dummy
{
    // ...

    static const unsigned int size = 4096;
    enum { another_size = 4096 };
};
于 2012-08-02T05:44:35.750 回答