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

时间:2014-10-22 10:57:12

标签: c++ c++11

我查看了一些使用原始指针的旧代码,并将其更改为unique_ptr。现在,当我尝试编译代码时,我收到此错误消息:

  

错误1错误C2280:' std :: unique_ptr> :: unique_ptr(const std :: unique_ptr< _Ty,std :: default_delete< _Ty>>&)' :尝试引用已删除的函数d:\ visual studio 2013 \ vc \ include \ xmemory0

关于这种情况的编译器输出很大 - 为了节省这个问题的空间,请看here

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

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

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

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

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

1 个答案:

答案 0 :(得分:17)

unique_ptr s无法复制;只感动!但由于std::list应该能够在内部移动它们,因此您唯一的问题应该是您对列表本身执行的分配。

你可以移动列表吗?

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

或者使用对它的引用?

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

如果不是(并且它将取决于Game::LEVEL->getEnemies()的返回类型,您可以使用上述解决方案中的哪一个),那么您需要深入,深入将复制到shared_ptr

这一切似乎都是一种障碍,但它实际上是通过严格执行有关你所有人的所有权的规则来帮助你。

相关问题