2014-10-22 3074 views
7

我检查了一些使用原始指针的旧代码,并将其更改为unique_ptr。现在,当我尝试编译的代码,我得到这个错误信息:错误C2280:尝试引用已删除的函数(unique_ptr)

错误1错误C2280:“的std ::的unique_ptr> ::的unique_ptr(常量的std ::的unique_ptr < _Ty,性病:: default_delete < _Ty >> &)”:试图引用删除的功能d:\的Visual Studio 2013 \ VC \包括\ xmemory0

有关情况编译器的输出是巨大的 - 节省空间在这个问题上,看到它here

据我所知,这与我使用独特指针的方式有关。它从这里开始(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(); 

为什么这是否会导致问题?我该如何解决这个错误?

+0

错误提醒您'std :: unique_ptr'不可复制。 – juanchopanza 2014-10-22 11:02:15

回答

15

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

这一切似乎都是一个障碍,但它实际上是在帮助您保持关于您的pointees所有权的规则严格执行。

+0

嗯,我以为我使用std :: list的引用 - getEnemies()返回'const std :: list &'。这不会产生一个const引用?还是我完全失去了这里? – manabreak 2014-10-22 11:04:51

+0

@manabreak:'const std :: list &*'无效!没有指向引用的指针。即使你要返回'const std :: list &',你仍然会放弃参考,并试图通过将该列表分配给一个全新的列表(称为'enemies')来复制该列表。也许'const std :: list &enemies = Game :: LEVEL-> getEnemies()'可以帮助你吗? – 2014-10-22 11:05:22

+1

星号是一个错字,我固定它,但你已经潜入了它。 :p – manabreak 2014-10-22 11:05:54

相关问题