Как исправить бинарный оператор - PullRequest
0 голосов
/ 31 мая 2019

Ошибка 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 ]

2 голосов
/ 31 мая 2019

Ошибка C2676 бинарная '[': 'collection :: item' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора

это потому что

item array = new item[top];

должно быть

item * array = new item[top];

но вы также должны переместить инициализацию в конструкторе, когда top имеет значение


Из этого лучше, если бы конструктор collection(int top) получил значение без знака, равное collection(unsigned top) или лучше collection(size_t top)

Копировать contructor, operator = ... отсутствуют, а атрибут является указателем

Как насчет проверки допустимости i в collection& operator[](unsigned int i) и void addvar(int i, T1 item, T2 key) для получения исключения, когда оно недопустимо? addvar - также странное имя, потому что это set , add означает, что размер увеличен. Вы не можете получить доступ к элементу в экземпляре const, добавьте const collection& operator[](unsigned int i) const

В void extendarray() удвоение размера мало что даст, если начальный размер равен 0; -)

0 голосов
/ 31 мая 2019

Кажется, вы имеете в виду, по крайней мере, что-то вроде следующего

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

Конечно, вы можете продолжить разработку кода.

0 голосов
/ 31 мая 2019

Просто предположение: top унифицирован. Это делает массив массивом с нулевой длиной в лучшем случае (что действительно плохо) и вызывает неопределенное поведение в худшем случае.

...