Problème avec vector<unique_ptr<Class>>

Le problème exposé dans ce sujet a été résolu.

Bonjour !

Je suis en train de développer un jeu, et du coup j’implémente un Entity Component System, j’utilise dedans des vector d’unique_ptr, et j’arrête pas d’avoir cette erreur :

C:\Program Files\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_construct.h|75|error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Entity; _Dp = std::default_delete<Entity>]'|

Est-ce que quelqu’un aurait une idée du problème ? Je comprends pas pourquoi ça fait ça… Merci d’avance pour votre aide !

===================================

EDIT : J’ai trouvé le problème, en gros j’utilise une classe contenant des vector d’unique_ptr, comme dit précédemment, mais je l’utilisais sans pointeur (je faisais EntityManager em; au lieu de EntityManager* em;) ! Merci quand même ^^

+0 -0

Bonjour,

Les std::unique_ptr<> sont des objets non copiables, ils sont uniquement transférables (ça leurs garantit d’être uniques). Et tu tentes par endroit de les copier. Le plus souvent ça se résous en utilisant la fonction std::move(). Il nous faudra des données sur ton code pour une aide plus précise.

Bah le problème pour lequel j’avais posé ma question est réglé, mais j’en ai un autre avec la même erreur, avec ces fonctions-là :

sdl2::TexturePTR TextureManager::getTexture(std::string id) {
    if(textures.count(id) > 0) {
        return textures.at(id);
    }
    return nullptr;
}
sdl2::FontPTR TextureManager::getFont(std::string id) {
    return (fonts.count(id) > 0 ? fonts[id] : nullptr);
}

Les types TexturePTR et FontPTR sont des unique_ptr<SDL_Texture (TTF_Font pour FontPTR),SDL_Deleter> avec SDL_Deleter un foncteur de destructeurs des structures de la SDL. Les attributs textures et fonts sont eux des map<string, TexturePTR (FontPTR pour fonts)> :p

Bonjour,

Tes deux fonctions ne devraient par retourner un unique_ptr<>. Car l’unicité t’obligerait à les ôter des fonts[] et textures[], ce qui ne me semble pas être ton but. Elles devraient plutôt retourner un simple pointeur sur l’entité demandée.

SDL_Texture*  TextureManager::getTexture(std::string id) {
    if ( textures.count(id) > 0 ) {
        return  textures.at(id).get();
    }
    return  nullptr;
}
TTF_Font*  TextureManager::getFont(std::string id) {
    return  fonts.count(id) > 0 ? fonts[id].get() : nullptr;
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte