错误C2676二进制'[':'collection :: item'没有定义此运算符或未转换为预定义运算符可接受的类型
我读了很少的帖子和Microsoft VS网站,但不明白如何解决该问题
template<typename T1, typename T2>
class collection {
private:
class item {
public:
T1 item; T2 key;
};
unsigned int top;
item array = new item[top];
public:
collection& operator[](unsigned int i) {
return array[i];
}
collection(int top) {
this->top = top;
}
void coutarr() {
for (int i = 0; array[i] != 0; i++) {
cout << array[i].item << endl;
}
}
void extendarray() {
item x = new item[top*2];
for (int i = 0; i < top; i++) {
x[i] = array[i];
}
delete []array;
swap(array, x);
top = top*2;
}
void addvar(int i, T1 item, T2 key) {
array[i].item = item; array[i].key = key; //Here 2 Errors
}
};
如果有人可以解释我该怎么办,我将不胜感激。谢谢。
答案 0 :(得分:2)
错误C2676二进制'[':'collection :: item'没有定义此运算符或未转换为预定义运算符可接受的类型
这是因为
item array = new item[top];
必须
item * array = new item[top];
,但是当 top 具有值时,还必须在构造函数中移动初始化
最好让构造函数collection(int top)
获得collection(unsigned top)
或更好的collection(size_t top)
的无符号值
属性为指针时,缺少复制构造函数,operator = ...
如何检查collection& operator[](unsigned int i)
和void addvar(int i, T1 item, T2 key)
中的 i 的有效性以在无效时产生异常? addvar 也是一个奇怪的名称,因为它是一个 set ,一个 add 表示大小增加了。您无法访问const实例上的元素,请添加const collection& operator[](unsigned int i) const
在void extendarray()
中,如果初始大小为0,则将大小增加一倍不会有很多效果;-)
答案 1 :(得分:0)
一个猜测:top
已被单位化。这使得数组最好是零长度的数组(这是很糟糕的),而最坏的情况是调用未定义的行为。
答案 2 :(得分:0)
看来您的意思至少是以下内容
template<typename T1, typename T2>
class collection {
private:
class item {
public:
T1 item; T2 key;
};
unsigned int top;
item *array;
^^^^^^^^^^^^^
public:
auto & operator[](unsigned int i) {
^^^^
return array[i];
}
collection(unsigned int top) : top( top ), array( new item[top]{} )
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
}
~collection() { delete []array; }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
collection( const collection & ) = delete;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
collection & operator =( const collection & ) = delete;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void coutarr() {
for (int i = 0; array[i] != 0; i++) {
cout << array[i].item << endl;
}
}
void extendarray() {
item x = new item[top*2];
for (int i = 0; i < top; i++) {
x[i] = array[i];
}
delete []array;
swap(array, x);
top = top*2;
}
void addvar(int i, const T1 &item, const T2 &key) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
array[i].item = item; array[i].key = key; //Here 2 Errors
}
};
当然,您可以进一步开发代码。