c++ visual-c++ visual-studio-2013 unique-ptr oglplus

c++ - unique_ptr & vector, intentando acceder a la función eliminada, Visual Studio 2013



visual-c++ visual-studio-2013 (1)

Intento utilizar unique_ptr para administrar mi memoria, y VS2013 parece estar causando problemas cuando creo que no debería ser así.

Parece que el compilador, por cualquier razón, intenta acceder a un constructor de copia eliminado cuando realmente no debería tener ninguna razón para hacerlo.

Esto es lo que parece una de mis clases:

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; };

El problema es con la línea

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

comienza a escupir cosas como

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

No estoy usando std::vector::resize() ni nada por el estilo (de hecho, comenté todos los usos de mi vector de _meshes, e incluso intenté comentar la implementación completamente en vano), así que no entiendo por qué el compilador me está dando problemas.

¿Alguien tiene alguna idea?

Gracias Preetish Kakkar por encontrar el problema. Resultó que era un problema con las funciones generadas por el compilador que usaban implícitamente el constructor de copia y el operador = de la clase Mesh forzando al compilador a probar y usar las funciones eliminadas.


Reproduje tu problema, a continuación se muestra el código de muestra.

#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; }

El problema es que en algún momento está intentando copiar dos objetos modelo que no se pueden hacer ya que unique_ptr no se puede copiar.