2014-10-22 11 views
7

Ho passato un vecchio codice che utilizzava puntatori grezzi e li ho modificati in unique_ptr s. Ora, quando provo a compilare il codice, ottengo questo messaggio di errore:Errore C2280: tentativo di fare riferimento a una funzione cancellata (unique_ptr)

Errore 1 Errore C2280: 'std :: unique_ptr> :: unique_ptr (const std :: unique_ptr < _Ty, std :: default_delete < _Ty >> &)': il tentativo di fare riferimento a una funzione eliminata d: \ visual Studio 2013 \ VC \ include \ xmemory0

l'output del compilatore per la situazione è enorme - per risparmiare spazio in questa domanda, vedono here .

Per quanto posso dire, ha qualcosa a che fare con il modo in cui utilizzo i puntatori unici. Si parte da qui (level.h, linee 65-66):

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

Ora, il prossimo indizio salgo in output del compilatore è la linea 47 in basesource.cpp:

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

Perché questo causa problemi? Come posso correggere l'errore?

+0

L'errore ti ricorda che 'std :: unique_ptr' non è copiabile. – juanchopanza

risposta

15

unique_ptr s non possono essere copiati; solo mosso! Ma dal momento che std::list dovrebbe essere in grado di spostarli internamente, il tuo unico problema dovrebbe essere l'assegnazione che stai eseguendo alla lista stessa.

Puoi spostare l'elenco?

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

Oppure utilizzare un riferimento ad esso, invece?

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

In caso contrario (e dipende dal tipo di ritorno di Game::LEVEL->getEnemies() quanto a cui, se uno, delle soluzioni di cui sopra è possibile utilizzare), si sta andando ad avere bisogno di fare una copia profonda e profonda o passa invece a shared_ptr.

Questo potrebbe sembrare un ostacolo, ma in realtà ti sta facendo un favore mantenendo rigorosamente applicate le regole relative alla proprietà dei tuoi punti.

+0

Hmm, pensavo di usare un riferimento a std :: list - getEnemies() restituisce 'const std :: list &'. Non produce un riferimento const? O sono completamente perso qui? – manabreak

+0

@manabreak: 'const std :: list & *' non è valido! Non ci sono riferimenti a riferimenti. Anche se dovessi restituire 'const std :: list &', stai ancora rilasciando il riferimento e tentando di copiare quell'elenco assegnandolo a uno nuovo (chiamato 'enemy'). Forse 'const std :: list & enemy = Game :: LEVEL-> getEnemies()' può aiutarti? –

+1

L'asterisco era un errore di battitura, l'ho risolto, ma l'hai già passato di nascosto. : p – manabreak

Problemi correlati