Чтобы изучить C++, я программирую игру. В этой игре могут быть два игрока. Эти игроки могут подключаться друг к другу с помощью сокетов. После добавления вектора с уникальными указателями в заголовок проигрывателя я получил ошибку: «Ошибка C2280» std :: unique_ptr> :: unique_ptr (const std :: unique_ptr < _Ty, std :: default_delete < _Ty >> &) ': попытка для ссылки на удаленную функцию ". Такая же ошибка для векторов здания.Почему я получил сообщение об ошибке «Попытка ссылаться на удаленную функцию» после добавления вектора с уникальными указателями в мой заголовочный файл?
Чтобы дать более четкое представление о том, что проблема, я установил мой файл заголовка в блоке кода ниже:
class Player {
public:
Player() {}
Player(const std::string& name) : _name {name} {}
std::string get_name() const { return _name; }
void set_name(const std::string & new_name) { _name = new_name; }
const bool compare_name(const std::string & name) const;
void set_coins(const int coins);
const int get_coins();
void set_king(const bool king);
const bool get_king();
private:
std::string _name;
int _coins;
bool _is_king;
std::vector<std::unique_ptr<Building>> _buildings;
std::vector<std::unique_ptr<Building>> _placed_buildings;
std::vector<std::unique_ptr<Character>> _characters;
};
Последние три вектора являются векторами, которые я пытался добавить к моему файл заголовка. Я добавил их в другой класс аналогичным образом. И в этом классе это не привело к ошибке. Но в моем заголовочном файле моего плеера. Не могли бы вы помочь мне решить эту проблему?
Вся помощь будет оценена по достоинству.
Edit: попытка объяснить, почему этот вопрос не является дубликатом.
Это может быть дубликатом, но сейчас, насколько я могу видеть, что в этом вопросе: «Why can I not push_back a unique_ptr into a vector?» кто-то пытается вызвать функцию push_back без использования зЬй :: двигаться в push_back. На данный момент я не пытаюсь вкладывать ценности в свой вектор. То, что я хочу, - это вектор уникальных указателей внутри моего заголовка. Поэтому я пока не пытаюсь заполнить векторы элементами. Поэтому я склонен думать, что пока невозможно использовать std :: move для векторов здания и символа. Я знаю, что эта ошибка часто возникает, когда вы не вызываете функцию std :: move, потому что я смотрел на другие записи StackOverflow. Но ни один из них, похоже, не имеет правильного ответа на мой вопрос. Потому что ответ на большинство из них: используйте «std :: move» или используйте «конструктор по умолчанию», и это не решило мою проблему.
Мое предположение, что это связано с тем, что игрок определяется как shared_ptr, а игрок - это контейнер для векторов, который может быть частью проблемы?
Vectors сделать много копий. 'unique_ptr' не может быть скопирован, потому что это разрушает всю уникальную вещь. Вероятно, вам придется использовать 'std :: move'. – user4581301
@ user4581301 Я склонен думать, что это не проблема. Я просто добавил вектор в свой заголовок. Я не использовал вызов метода и не пытался заполнить его элементами. Я получил ошибку, когда я разместил вектор внутри заголовка. Если я прав, тогда нет места, где я мог бы использовать std :: move для вектора, или я мог бы использовать его где-то еще? – user3473161
Нужна [mcve], чтобы помочь вам. [Я не могу воспроизвести то, что вы предоставили.] (Http://ideone.com/UUocBe) Дайте нам с чем работать, и я проголосую, чтобы разблокировать, предполагая, что MCVE каким-то образом не подтверждает дубликат. – user4581301