我查看了一些使用原始指针的旧代码,并将其更改为unique_ptrs代替.现在,当我尝试编译代码时,我收到以下错误消息:
错误1错误C2280:'std :: unique_ptr> :: unique_ptr(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)':尝试引用已删除的函数d:\ visual studio 2013\vc \包括\ xmemory0
关于这种情况的编译器输出是巨大的 - 为了节省这个问题的空间,请在此处查看.
据我所知,它与我使用唯一指针的方式有关.它从这里开始(level.h,第65-66行):
typedef std::unique_ptr<Enemy> PEnemy;
std::list<PEnemy> m_enemies;
Run Code Online (Sandbox Code Playgroud)
现在,我在编译器输出中得到的下一个线索是basesource.cpp中的第47行:
std::list<PEnemy> enemies = Game::LEVEL->getEnemies();
Run Code Online (Sandbox Code Playgroud)
为什么这会导致问题?我该如何修复错误?
Lig*_*ica 17
unique_ptrs无法复制; 只感动!但是既然std::list应该能够在内部移动它们,那么唯一的问题应该是你在列表中执行的任务.
你能移动清单吗?
std::list<PEnemy> enemies = std::move(Game::LEVEL->getEnemies());或者使用对它的引用?
const std::list<PEnemy>& enemies = Game::LEVEL->getEnemies();如果不是(并且它将取决于Game::LEVEL->getEnemies()您可以使用的上述解决方案的返回类型),您将需要进行深度深度复制或切换到shared_ptr.
这一切似乎都是一种障碍,但它实际上是通过严格执行关于你的所有权的规则来帮助你.