错误 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<xstring>
。有时,语法错误只会出现在错误之后的代码中,这就是您的错误可能导致编译器阻塞其他代码的原因。
@cable729:刚刚添加了可能导致此问题的提示。
@cable729:您上面的代码没有显示复制 ctor。编译器“有帮助”为您生成了一个复制 ctor 和一个赋值操作,但这些都是错误的,因为它们对数据成员进行了浅拷贝,导致您的类的两个实例的 list
成员指向同一个对象,他们的析构函数将其删除了两次...
@cable729:我们从 C 中继承了 struct ... foo;
(类只不过是 struct
的同义词)并且不会摆脱它,无论它多么不需要。
【参考方案3】:
list
的声明应该是T* list;
。您当前的声明说您想要一个指向T
的未调整大小的指针数组。
【讨论】:
以上是关于错误 C2229:类 'VectorRemake<T>' 具有非法的零大小数组的主要内容,如果未能解决你的问题,请参考以下文章
错误的类文件:… 类文件具有错误的版本 52.0,应为 50.0