Этот ответ основан на правильном предложении @Praetorian.
Короткий ответ с исправлением:
Проблема заключается в std::vector<Pickup>& copy;
члена Enemy
класса. Измените это на std::vector<Pickup> copy;
, удалив ссылку, чтобы исправить ошибку. В самом деле, нет необходимости хранить vector
в качестве ссылки, напротив, как вы можете видеть, наличие ссылочных элементов в классе вызывает ошибки, подобные тому, с которым вы столкнулись. Возможно, вас смутил тот факт, что vector
передается ссылкой на инициализацию c'tor, но это никоим образом не означает, что вы также должны сделать элемент класса ссылкой.
Если вы все еще хотите хранить данные Enemy::copy
по ссылке, например. проблемы производительности, рассмотреть возможность сделать это указатель, например, так:
class Enemy : public Entity
{
private:
std::vector<Pickup>* copy;
// rest of the class...
};
Длинный ответ:
код воспроизвести проблему:
class Foo
{
int& ri;
public:
// default c'tor can't be defined in a sane fashion because of the reference member ri
// Foo() : ri(0) {}
Foo(int& _ri) : ri(_ri) {}
};
int main(int argc, char **argv)
{
int i{42};
Foo f1{i};
Foo f2{f1}; // we don't have a default constructor so using auto-generated copy c'tor
f2 = f1; // <--- error
return 0;
}
приведет к ошибке:
main.cpp: In function 'int main(int, char**)':
main.cpp:14:12: error: use of deleted function 'Foo& Foo::operator=(const Foo&)'
f2 = f1; // <--- error
^
main.cpp:1:11: note: 'Foo& Foo::operator=(const Foo&)' is implicitly deleted
because the default definition would be ill-formed:
class Foo
^
main.cpp:1:11: error: non-static reference member 'int& Foo::ri',
can't use default assignment operator
Пояснение:
Автогенератор operator=()
, который в противном случае был бы сгенерирован в этом случае [1], считается ill-formed
из-за того, что вы не можете переназначить ссылки в C++ [2]. Автогенератор operator=(Foo& other)
, если он существует, попытается выполнить this->ri = other.ri
, который считается некорректным («плохо сформированный», как сообщается компилятором), поскольку это повторное назначение ссылки ri
.
И наконец, я предлагаю ознакомиться с [3] с подробным ответом на вопрос.
about auto-generated copy assignment operator
about re-assigning references
Assignment operator and copy constructor in the presence of references
Две строки из 'main', что вы показали, не вызывают ошибки вас в курсе. Он жалуется на конструктор удаленной копии. Ни один из ваших кодов не использует построение копирования. Ошибка в другом месте. – CoryKramer
Вероятно, «враг» передается по значению позже –
Позже ничего не происходит с копией, поэтому я не знаю, что не так,/ –