如何修复二进制运算符

时间:2019-05-31 16:54:29

标签: c++ visual-studio class compiler-errors declaration

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

如果有人可以解释我该怎么办,我将不胜感激。谢谢。

3 个答案:

答案 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
    }
};

当然,您可以进一步开发代码。