Почему получаю ошибку `copy assignment operator is implicitly deleted`?

114
21 апреля 2021, 03:20

Есть класс в котором есть вот такая переменная

PoolWrapper<FrameManager> m_PoolWrapperFrameManager;

Вот ее имплементация

public:
    PoolWrapper() = default;
    PoolWrapper(TYPE *obj, int index, ObjPool<TYPE> *objPool);
    ~PoolWrapper();
    PoolWrapper(const PoolWrapper &) = delete;
    PoolWrapper(PoolWrapper &&other)
    {
        this->m_index = other.m_index;
        this->m_obj = other.m_obj;
        this->m_objPool = other.m_objPool;
        other.m_index = EMPTY_INDEX;
        other.m_obj = nullptr;
        other.m_objPool = nullptr;
    }

Теперь я хочу в эту переменную m_PoolWrapperFrameManager мувнуть обьект из очереди.

Делаю это вот так

m_PoolWrapperFrameManager = std::move(m_fifo.dequeue());

И вот метод dequeue()

 PoolWrapper<FrameManager> dequeue()
    {
        std::unique_lock<std::mutex> lock(m_mutex);
        while (m_queue.empty())
        {
            // release lock as long as the wait and reaquire it afterwards.
            m_condition.wait(lock);
        }
        PoolWrapper<FrameManager> val = std::move(m_queue.front());
        m_queue.pop();
        return val;
    }

В итоге получаю вот такую ошибку

error: object of type 'PoolWrapper<FrameManager>' cannot be assigned because its copy assignment operator is implicitly deleted

Что делаю не так?

Answer 1

Определите оператор присваивания, у вас его а нет.

PoolWrapper& operator=(PoolWrapper &&other) {
  this->~PoolWrapper();
  return *new(this) PoolWrapper(std::move(other));
}
Answer 2

Видимо вы надеетесь на то, что компилятор неявно сгенерирует этот оператор за вас, однако этого не произойдет, так как у вас явно определен конструктор копирования и перемещения. Компилятор никогда не генерирует копирующие / перемещающие конструкторы и операторы присваивания, если явно определен хотя бы один из них. Соответственно в такой ситуации операторы необходимо определять явно.

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

READ ALSO
Подключить SFML в VS Code

Подключить SFML в VS Code

Нужно подключить SFML для работы в VS Code на WindowsНикакой адекватной информации не нашел, разве что для Linux

82
Как функция передаётся в качестве параметра?

Как функция передаётся в качестве параметра?

Не совсем могу понять как в шестой строке функция передаётся в качестве параметраКак я понял, код string(*fun)() должен обьявлять указатель fun, которому...

104
Обратиться к псевдониму типа в определении метода вне класса

Обратиться к псевдониму типа в определении метода вне класса

Составил небольшой примерКомпилятор не может найти тип ref как возвращаемое значение метода getA()

92
Специализация шаблонов и общий код

Специализация шаблонов и общий код

При специализации шаблона под конкретный тип, общий класс используется на ура, а специализация, использующая то же определение метода, что...

86