Ошибка: использование удаленной функции при попытке использовать ссылку

Я начал изучать C++ и столкнулся с этой проблемой компиляции. Когда я меняю размер al2, мне нужно изменить размер в al.get(0).

Сообщение об ошибке полной компиляции:

arraylist.cpp: In instantiation of 'void jpparl::ArrayList<T>::add(T) [with T = jpparl::ArrayList<int>]':
arraylist.cpp:90:15:   required from here
arraylist.cpp:46:33: error: use of deleted function 'jpparl::ArrayList<int>& jpparl::ArrayList<int>::operator=(const j
pparl::ArrayList<int>&)'
                 array[usedSize] = elem;
                 ~~~~~~~~~~~~~~~~^~~~~~
arraylist.cpp:5:30: note: 'jpparl::ArrayList<int>& jpparl::ArrayList<int>::operator=(const jpparl::ArrayList<int>&)' i
s implicitly deleted because the default definition would be ill-formed:
     template <class T> class ArrayList {
                              ^~~~~~~~~
arraylist.cpp:5:30: error: non-static reference member 'long int& jpparl::ArrayList<int>::usedSize', can't use default
 assignment operator
In file included from arraylist.cpp:2:0:
jppsys.cpp: In instantiation of 'static void jppsys::JPPSystem::arraycopy(T*, long int, long int, T*, long int) [with
T = jpparl::ArrayList<int>]':
jppsys.cpp:10:22:   required from 'static void jppsys::JPPSystem::expand(T**, long int, long int) [with T = jpparl::Ar
rayList<int>]'
arraylist.cpp:42:46:   required from 'void jpparl::ArrayList<T>::add(T) [with T = jpparl::ArrayList<int>]'
arraylist.cpp:90:15:   required from here
jppsys.cpp:5:78: error: use of deleted function 'jpparl::ArrayList<int>& jpparl::ArrayList<int>::operator=(const jppar
l::ArrayList<int>&)'
             for (long i = 0; i < srcEnd - srcStart; i++) dest[destStart + i] = src[srcStart + i];
                                                          ~~~~~~~~~~~~~~~~~~~~^~~~~~

И мой исходный код:

#include <iostream>
#include "jppsys.cpp"

namespace jpparl {
    template <class T> class ArrayList {
        long l = 0;
        long &usedSize = l;

        private:
            T *array;
            int step;
            long totalSize;

        public:
            ArrayList(long step) {
                this->step = step;
                totalSize = step;
                array = new T[step];
            }

            ArrayList() {
                this->step = 8;
                totalSize = step;
                array = new T[step];
            }

            void add(T elem, long index) {
                if (usedSize == totalSize) totalSize += step;

                T *tmp = new T[totalSize];
                jppsys::JPPSystem::arraycopy(array, 0, index, tmp, 0);
                jppsys::JPPSystem::arraycopy(array, index, usedSize, tmp, index + 1);
                delete[] array;
                tmp[index] = elem;
                array = tmp;

                usedSize++;
            }

            void add(T elem) {
                if (usedSize == totalSize) {
                    jppsys::JPPSystem::expand(&array, usedSize, usedSize + step);
                    totalSize += step;
                }
std::cout << usedSize << " add\n";
                array[usedSize] = elem;
                usedSize++;
            }

            void remove(long index) {
                if (usedSize == totalSize - step) totalSize -= step;

                T *tmp = new T[totalSize];
                jppsys::JPPSystem::arraycopy(array, 0, index, tmp, 0);
                jppsys::JPPSystem::arraycopy(array, index + 1, usedSize, tmp, index);
                delete[] array;
                *array = *tmp;
                usedSize--;
            }

            void remove() {
                if (usedSize == totalSize - step) {
                    jppsys::JPPSystem::expand(&array, usedSize - step, usedSize - step);
                    totalSize -= step;
                }

                usedSize--;
            }

            T get(long index) {
                return array[index];
            }

            long size() {
                return usedSize;
            }

            long getTotalSize() {
                return totalSize;
            }
    };

}

using namespace jpparl;
using namespace std;
int main() {
    ArrayList<ArrayList<int>> al;
    ArrayList<int> al2;
    al.add(al2);
    al2.add(256);
    cout << al2.size() << " " << al.get(0).size() << "\n";
}

Буду благодарен за помощь

В сообщении об ошибке четко объясняется, что, поскольку ваш класс ArrayList имеет член usedSize, который является ссылкой на long, он не может быть назначен с помощью =, поскольку ссылки не могут быть переустановлены.

Öö Tiib 10.08.2018 15:40

Класс со ссылочным членом получает удаленный оператор присваивания. Примерно в 100% случаев рекомендательный член вам не нужен. Почему usedSize является эталоном? (Это даже ссылка на l, которым вы никогда не пользуетесь.)

molbdnilo 10.08.2018 15:40

Объекты @molbdnilo со ссылочными элементами, безусловно, могут быть созданы копированием, но то, что делает код OP, - это присваивание копии.

Öö Tiib 10.08.2018 15:42

Кстати, в школе я высмеивал учителя, потому что он пытался убедить меня, что l - не лучшее имя переменной, мне потребовалось некоторое время, чтобы понять, что он имел в виду, но теперь я полностью на его стороне;)

463035818_is_not_a_number 10.08.2018 15:44
0
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
template <class T> 
class ArrayList {
        long l = 0;
        long &usedSize = l;

Наличие ссылки в вашем классе неявно удаляет ваш operator=, вам нужно его переписать, также я не совсем уверен, почему вам нужна частная ссылка на переменную вашего класса? Если вы удалите ссылку и просто используете переменную l, она должна работать.

Также #include "jppsys.cpp"

не включайте файлы .cpp.

Ну как мне изменить размер al.get(0) при изменении размера al2? Если я не использую ссылку, usedSize не изменится в al.get(0), только в al2

congard 10.08.2018 15:49

@congard, зачем вам изменять размер одного списка при изменении другого списка? В любом случае вы можете использовать указатель вместо ссылки. Указатели назначаются.

eerorika 10.08.2018 15:57
al.get(0) и al2 - разные переменные, когда вы используете al.add(al2), вы делаете копию al2, поэтому al.get(0) и al2 теперь являются двумя разными объектами.
Kaldrr 10.08.2018 16:09

Другие вопросы по теме