在定义类中数组大小时,使用常量数组的元素时出现“数组边界不是整数常量”的错误。

3
#ifndef QWERT_H
#define QWERT_H

const int x [] = {1, 2,};
const int z = 3;
#endif


#include <iostream>
#include "qwert.h"
class Class   
{  
    int y [x[0]];  //error:array bound is not an integer constant
    int g [z];     //no problem  
};


int main ()  
{  

    int y [x[0]];      //no problem
    Class a_class;

}

我无法弄清为什么这不起作用。其他遇到此问题的人似乎在尝试动态分配数组。非常感谢任何帮助。


1
无关的,但是#ifndef QWERT_H应该只出现在qwert.h中,而#include "qwert.h"不应该出现在qwert.h中。 - MSalters
3个回答

4

x是常量(z也显然是),但x[0]不是一个常量表达式。类定义中的数组声明必须具有恒定的大小指定符。

考虑一下这个问题;如果在编译时包含未知大小的数组,您会如何期望sizeof运算符评估类的大小呢?


x[0] 是 const,但它并不是常量表达式。 - Yakov Galka
在这种情况下,x [0] 是一个只读位置。尝试为 x [0] 分配一个值,你会得到一个编译时“分配只读位置”的错误提示。 - Matt K
是的,我明白了。我没有意识到常量表达式和只读位置/常量之间有潜在的区别,也没有意识到x[0]会构成后者。我想问题可能是数组访问发生得太晚,以至于它不能作为常量表达式被允许?顺便说一句,谢谢大家的帮助。 - Matt Munson
这只是一个“就是这样”的问题,而不是任何根本的技术原因(比如你暗示的“发生得太晚”)。 - Fred Nurk
考虑以下可能有所帮助的例子:"extern int const x; int a[x];"。尽管 x 是一个 int const,但它目前还不能用于整数常量表达式中。 - Fred Nurk

3
主版本可用是因为您的编译器具有扩展功能,允许使用可变长度数组。在C++03中,即便数组和索引都是常量表达式,访问数组也不能是常量表达式,这就是错误的来源。

1

数组的大小必须是一个常量表达式。我不认为数组中的常量元素符合此条件。

在main()函数中工作的版本可能是由于编译器扩展而实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接