错误C2280:尝试引用已删除的函数(unique_ptr)

13

我翻阅了一些旧代码,将其中使用的原始指针改为 unique_ptr。现在,当我尝试编译代码时,会收到以下错误消息:

Error 1 error C2280: 'std::unique_ptr<_Ty, std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : trying to reference a deleted function d:\visual studio 2013\vc\include\xmemory0

关于这种情况的编译器输出非常庞大 - 为节省空间,在本问题中请参见此处

据我所知,它与我使用 unique 指针的方式有关。它从这里开始(level.h、第 65-66 行):

typedef std::unique_ptr<Enemy> PEnemy;
std::list<PEnemy> m_enemies;

现在,编译器输出中给我下一个线索是basesource.cpp中的第47行:

std::list<PEnemy> enemies = Game::LEVEL->getEnemies();

为什么会导致问题?我该如何修复此错误?


错误提醒您,std::unique_ptr 不可复制。 - juanchopanza
1个回答

19

unique_ptr无法进行复制,只能移动!但由于std::list应该能够在内部移动它们,所以您唯一的问题应该是对列表本身执行的赋值。

您能够移动列表吗?

  • std::list<PEnemy> enemies = std::move(Game::LEVEL->getEnemies());

或者改用引用?

  • const std::list<PEnemy>& enemies = Game::LEVEL->getEnemies();

如果不行(这将取决于Game::LEVEL->getEnemies()的返回类型,因此您可以使用上述哪种解决方案,如果有的话),那么您将需要进行深度复制,或者改用shared_ptr

所有这些看起来可能是一个阻碍,但它实际上通过严格执行指针所有权规则,为您提供了帮助。


哦,我以为我正在使用std :: list的引用 - getEnemies()返回const std :: list <PEnemy>&。那不会产生一个const引用吗?还是我完全迷失了? - manabreak
@manabreak:const std::list<PEnemy>&*不是有效的!不存在指向引用的指针。即使您返回const std::list<PEnemy>&,您仍然会删除引用并尝试通过将其分配给全新的一个(称为enemies)来复制该列表。也许const std::list<PEnemy>& enemies = Game :: LEVEL->getEnemies()可以帮助您? - Lightness Races in Orbit
1
星号是打错了,我已经修正了,但你已经在它之前溜走了。:p - manabreak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接