2016-02-06 6 views
2

Я хочу, чтобы инициализировать Enemy::copy используя параметр, передаваемый в конструктор инициализации, но я получаю следующее сообщение об ошибке:Ошибка при попытке сослаться на удаленную функцию

C2280: 'Enemy &Enemy::operator =(const Enemy &)': attempting to reference a deleted function 

Вот декларация class Enemy:

#include "Pickup.h" 
class Enemy : public Entity 
{ 
private: 
     std::vector<Pickup>& copy; 
public: 
     Enemy::Enemy(std::vector<Pickup>& arraypickup) : copy(arraypickup) {} 
}; 

И код из main():

std::vector<Pickup> arraypickup; 
Enemy enemy(arraypickup); 

Как это решить?

+1

Две строки из 'main', что вы показали, не вызывают ошибки вас в курсе. Он жалуется на конструктор удаленной копии. Ни один из ваших кодов не использует построение копирования. Ошибка в другом месте. – CoryKramer

+0

Вероятно, «враг» передается по значению позже –

+0

Позже ничего не происходит с копией, поэтому я не знаю, что не так,/ –

ответ

2

Этот ответ основан на правильном предложении @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] с подробным ответом на вопрос.

  1. about auto-generated copy assignment operator

  2. about re-assigning references

  3. Assignment operator and copy constructor in the presence of references

Смежные вопросы