web-dev-qa-db-fra.com

unique_ptr & vector, essayant d'accéder à la fonction supprimée, Visual Studio 2013

J'essaie d'utiliser unique_ptr pour gérer ma mémoire, et VS2013 semble me poser des problèmes quand je pense que cela ne devrait pas l'être.

Il semblerait que le compilateur essaie pour une raison quelconque d'accéder à un constructeur de copie supprimé alors qu'il ne devrait vraiment avoir aucune raison de le faire.

Voici à quoi ressemble une de mes classes:

class Mesh
{
public:
    Mesh(oglplus::Program* program, const std::vector<Vertex>& vertices, 
                    const std::vector<GLuint>& indices);
    void draw();
private:
    const oglplus::Program* _program;
    std::vector<Vertex> _vertices;
    std::vector<GLuint> _indices;
    oglplus::Buffer _faceBuffer;
    oglplus::Buffer _vertexBuffer;
    oglplus::VertexArray _vao;
};

class Model
{
public:
    Model(std::string filename, oglplus::Program* program);
    void draw();
private:
    const oglplus::Program* _program;
    std::vector<std::unique_ptr<Mesh>> _meshes;
};

Le problème est avec la ligne

 std::vector<std::unique_ptr<Mesh>> _meshes;

ça commence à cracher des choses comme

2>c:\program files (x86)\Microsoft visual studio 12.0\vc\include\xmemory0(593): error C2280: 'std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2>          c:\program files (x86)\Microsoft visual studio 12.0\vc\include\memory(1486) : see declaration of 'std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>::unique_ptr'
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2>          c:\program files (x86)\Microsoft visual studio 12.0\vc\include\xmemory0(592) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
2>          with
2>          [
2>              _Ty=std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>
2>          ]
2>          c:\program files (x86)\Microsoft visual studio 12.0\vc\include\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' being compiled
2>          with
2>          [
2>              _Ty=std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>
2>          ]
2>          c:\program files (x86)\Microsoft visual studio 12.0\vc\include\type_traits(572) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
2>          with
2>          [
2>              _Ty=std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>
2>          ]
2>          c:\program files (x86)\Microsoft visual studio 12.0\vc\include\vector(650) : see reference to class template instantiation 'std::is_empty<_Alloc>' being compiled
2>          with
2>          [
2>              _Alloc=std::allocator<std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>>
2>          ]
2>          c:\users\vitali\projects\3d-stg\source\model\model.hpp(45) : see reference to class template instantiation 'std::vector<std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>' being compiled
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2>  model.cpp

Je n'utilise pas std::vector::resize() ou quelque chose comme ça (en fait, j'ai commenté toutes les utilisations de mon vecteur _meshes, et j'ai même essayé de commenter complètement l'implémentation en vain), donc je ne comprends pas pourquoi le le compilateur me donne des problèmes.

Est-ce que quelqu'un a des idées?


Merci Preetish Kakkar d'avoir trouvé le problème. Il s'avère que c'était un problème avec les fonctions générées par le compilateur en utilisant implicitement le constructeur de copie et l'opérateur = de la classe Mesh forçant le compilateur à essayer d'utiliser les fonctions supprimées.

21
Vitali

J'ai reproduit votre problème, voici un exemple de code.

#include <vector>
#include <memory>

class Mesh
{
public: 
    Mesh() {}
    void draw() {}
private:
};

class Model
{
public:
    Model() {}
    void draw() {}
private:
    typedef std::unique_ptr<Mesh> MeshUniquePtr;
    std::vector<MeshUniquePtr> _meshes;
};


int _tmain(int argc, _TCHAR* argv[])
{
    Model m;
    Model m1;
    m = m1; // causes error as you can't copy unique ptr

    return 0;
}

Le problème est qu'à un moment donné, vous essayez de copier deux objets de modèle, ce qui ne peut pas être fait car unique_ptr n'est pas copiable.

21
Blackhole