错误 C2229:类 'VectorRemake<T>' 具有非法的零大小数组

Posted

技术标签:

【中文标题】错误 C2229:类 \'VectorRemake<T>\' 具有非法的零大小数组【英文标题】:error C2229: class 'VectorRemake<T>' has an illegal zero-sized array错误 C2229:类 'VectorRemake<T>' 具有非法的零大小数组 【发布时间】:2010-11-21 20:17:37 【问题描述】:
template <class T>
class VectorRemake

private:
    T* list[];
    int count;
    int capacity;

public:
    VectorRemake() :capacity(DEFAULT_CAPACITY) :count(0) list = new T[capacity];
    VectorRemake(int capacity) :capacity(capacity) :count(0) list = new T[capacity];
~VectorRemake() delete [] list;

    ...

我不确定我在这里做错了什么。造成问题的是构造函数。

void resize(int size, T t=T())
    
        if (size < capacity)
        
            for (int i = size; i < capacity; i++)
                T[i] = 0;
            count = size;
        
        else if(size > capacity)
        
            T *newlist = new T[size];

            for (int i = 0; i < count; i++) newlist[i] = list[i];
            for (int i = count; i < size; i++) newlist[i] = t;

            delete [] list;
            list = newlist;
        
        else return;
        capacity = size;
    

我收到 4 个错误 @T[i] = 0; (第 6 行)。

我正在尝试将其设置为 NULL,但我的导师告诉我 NULL 不是 c++ 标准,我应该怎么做?

警告 1 警告 C4091: '' : 当没有声明变量时,'double' 左侧被忽略 3\solution11-3\solution11-3.cpp 46 错误 2 错误 C2143:语法错误:缺少 ';'在'['之前 错误 3 错误 C2337:“i”:找不到属性 错误 4 错误 C2143:语法错误:缺少 ';'在'='之前

【问题讨论】:

在初始化列表中初始化list 好的,我通过将其更改为 T* 列表将其减少为一个错误;我还将第二个构造函数更改为: VectorRemake(int capacity) :capacity(capacity), :count(0), :list(new T[capacity]) 我现在收到错误:C2059:语法错误:': ' 删除除第一个冒号以外的所有内容。 @GMan: NO! 这会爆炸(希望 - 可能会发生更糟糕的事情),因为成员按照它们在类定义中声明的顺序进行初始化,这在这种情况下是不合适的(而且通常很脆弱)。 cable,不要通过 list[i] = 0; 破坏数组中的元素。你不知道T 可能是什么,它是否可以用0 进行初始化,如果这不会在你的脸上爆发。 (它适用于std::string。)您可以使用T() 语法默认构造一个对象。 std::vector 做得更好,它分配原始存储并就地构造/销毁对象,但是一旦你掌握了这个阶段,就把它作为优化。 【参考方案1】:

T* list[]; 是指针数组(如果是动态分配的数组数组)。而且你不能使用开放数组作为属性。

你很可能想要T* list;

【讨论】:

【参考方案2】:

这不是构造函数。它是T* list[],它将成员list 定义为指向T 的指针数组,而没有给出数组的大小。 你可能想要T* list;

另请注意,根据 Rule of Three,您的类具有析构函数,还需要 复制构造函数 和一个赋值运算符。 使用 Copy & Swap idiom 在析构函数和复制构造函数之上实现赋值运算符。

那么,您的初始化列表的语法是错误的。这是

VectorRemake() : capacity(DEFAULT_CAPACITY), count(0) list = new T[capacity];
//                                         ^
//                                         comma, not colon

最后,在 C++ 中,类定义后面必须跟一个分号,否则在类定义之后的代码中会出现有趣的错误。 原因是类定义可能是变量定义的一部分:

class foo  ...  bar;

(这将bar定义为foo类型的变量。事实上,甚至可以使用没有名称的类:

class  ...  foobar;

虽然很少这样做。)

编译器需要分号来判断是否

class x 

y yaddayadda ...

y 定义为x 的实例或yaddayadda 的开头。

【讨论】:

当我将其更改为 T* 列表时;我从 xstring 得到 102 个错误。其中之一是:error C2205: 'std::ctype `RTTI Type Descriptor'' : cannot initialize extern variables with block scope @cable729:这可能是因为在某些翻译单元中,您的标题包含在之前(某些标题包含)&lt;xstring&gt;。有时,语法错误只会出现在错误之后的代码中,这就是您的错误可能导致编译器阻塞其他代码的原因。 @cable729:刚刚添加了可能导致此问题的提示。 @cable729:您上面的代码没有显示复制 ctor。编译器“有帮助”为您生成了一个复制 ctor 和一个赋值操作,但这些都是错误的,因为它们对数据成员进行了浅拷贝,导致您的类的两个实例的 list 成员指向同一个对象,他们的析构函数将其删除了两次... @cable729:我们从 C 中继承了 struct ... foo;(类只不过是 struct 的同义词)并且不会摆脱它,无论它多么不需要。 【参考方案3】:

list 的声明应该是T* list;。您当前的声明说您想要一个指向T 的未调整大小的指针数组。

【讨论】:

以上是关于错误 C2229:类 'VectorRemake<T>' 具有非法的零大小数组的主要内容,如果未能解决你的问题,请参考以下文章

错误的类文件:… 类文件具有错误的版本 52.0,应为 50.0

致命错误:未捕获的错误:未找到“Omnipay\Omnipay”类

扩展类异常时出现PHP“找不到类”错误

致命错误:未捕获的错误:未找到类“用户名”

[php] 错误接管类

从扩展类调用异步 - 错误不是封闭类