c++ - 非静态数据成员的无效使用

标签 c++ qt constants static

<分区>

我在 A.h 中有以下代码:

class A
{
public:
    ...
private:
    ...
    const int X = 1;
    float Y[X];
    ...
};

如果项目中只包含头文件 A.h,则可以正常编译。但是如果我在 A.cpp 中包含 A.h,它会给我如下奇怪的错误:

... warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]

... error: invalid use of non-static data member 'A::X'

... error: from this location

即使我更改 const int X = 1;(尽管我需要它作为常量参数),也没有任何变化。

附注如果有意义的话,我正在使用 Qt 5.1

附:实际上使它 static 修复了错误。但为什么我必须这样做?

最佳答案

第一个问题是您正在针对旧版本的 C++ 进行编译,该版本不允许在声明中初始化非静态(即每个对象而不是每个类)成员。您可以针对 C++11 进行编译(如错误消息所示);或者在构造函数中初始化它;或者将其设置为static,如果您不需要为您创建的每个对象设置单独的值。

第二个问题是数组大小必须是编译时常量。非静态成员、const 或其他方式不符合要求。原则上,它在不同的对象中可以有不同的值(即使它在声明中被初始化,它也可以被一个或多个构造函数覆盖),所以没有编译时值。静态成员确实有固定值,因此可以用作数组大小(如果该值可用)。

关于c++ - 非静态数据成员的无效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18386168/

相关文章:

c++ - 有效地复制/乘法树

c++ - 如何使用 Qt 从文件中读取 UTF-8 文本?

c++ - 具有 const 成员的结构 vector ?

c++ - 推断函数指针的模板参数

c++ - 复制列表初始化是否在概念上调用复制构造函数?

c++ - 在剪辑中复制环境的构造函数?

c++ - 通过 OpenGL 进行图像缩放(KeepAspectRatioByExpanding)

python - 如何使用 QStyledItemDelegate 只绘制背景,而不覆盖文本?

c++ - const 关键字在方法声明中的不同位置?

c++ - 为什么第一个程序不起作用但第二个程序有效?第二,为什么输出是它给出的?