2014-10-22 166 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

相關問題