首页 > 解决方案 > 如何修复二元运算符

问题描述

错误 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
    }
};

如果有人能解释我该怎么做,我将不胜感激。谢谢。

标签: c++visual-studioclasscompiler-errorsdeclaration

解决方案


错误 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 = ...丢失

如何检查i in的有效性collection& operator[](unsigned int i)void addvar(int i, T1 item, T2 key)在它无效时产生异常?addvar也是一个奇怪的名字,因为它是一个集合,一个add意味着大小增加。您无法访问 const 实例上的元素,请添加const collection& operator[](unsigned int i) const

如果void extendarray()初始大小为 0,则将大小加倍不会做很多;-)


推荐阅读