Ошибка компиляции с std :: deque :: erase с константными членами класса

Я получаю ошибку компиляции здесь, и я понятия не имею, что не так с кодом. Я использую g ++ 4.9.2.

#include<iostream>
#include<deque>

using std::string;
using std::deque;

class Dummy {
public:
virtual ~Dummy(){};
Dummy():ID_("00") {};
private:

const string ID_;
};

int main(){
{
deque <Dummy> waiter;
waiter.push_back(Dummy());
waiter.erase( waiter.begin() );
}
return 0;
}

Редактировать: я знаю, что удаление const удаляет ошибку компиляции, но я понятия не имею, почему. Во всяком случае, мне нужно это const.

2

Решение

станд :: Deque :: Стирание ожидает, что тип элемента должен быть MoveAssignable:

Требования к типу

T должен соответствовать требованиям MoveAssignable.

И класс Dummy имеет постоянный член const string ID_;, что делает его не присваиваемым по умолчанию оператором присваивания.

Вы могли бы сделать ID_ неконстантный член или предоставьте свой собственный оператор присваивания, чтобы сделать его назначаемым. например

Dummy& operator=(const Dummy&) { /* do nothing */ }

ЖИТЬ

5

Другие решения

Вы должны удалить const префикс, так что строка может быть изменена:

string ID_;

или измените его на статическую переменную и инициализируйте так:

class Dummy {
public:
virtual ~Dummy(){};
Dummy() {};
private:

static const string ID_;
};

const string Dummy::ID_ = "00";

Вы можете найти больше информации Вот об инициализации константной строки.

0

По вопросам рекламы [email protected]