уникальный ptr & vector, попытка доступа к удаленной функции, Visual Studio 2013
Я пытаюсь использовать unique_ptr для управления моей памятью, и VS2013, кажется, дает мне проблемы, когда я думаю, что это не должно быть.
казалось бы, компилятор по какой-то причине пытается получить доступ к конструктору удаленной копии, когда у него действительно не должно быть причин для этого.
вот как выглядит один из моих классов:
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;
};
проблема с линией
std::vector<std::unique_ptr<Mesh>> _meshes;
он начинает извергать такие вещи, как
2>c:program files (x86)microsoft visual studio 12.0vcincludexmemory0(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.0vcincludememory(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.0vcincludexmemory0(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.0vcincludexmemory0(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.0vcincludetype_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.0vcincludevector(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:usersvitaliprojectsd-stgsourcemodelmodel.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
I не использую std::vector::resize()
или что-то в этом роде (на самом деле я прокомментировал Все использование моего вектора _meshes и даже попытался комментировать реализацию полностью безрезультатно), поэтому я не понимаю, почему компилятор дает мне проблемы.
у кого-нибудь есть идеи?
спасибо Preetish Каккар для нахождения проблемы. Оказывается, это была проблема с компилятором функции неявно, используя конструктор копирования и оператор= класса сетка заставляя компилятор для использования удаленных функций.
1 ответов
я воспроизвел вашу проблему, ниже пример кода.
#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;
}
проблема в том, что в какой-то момент Вы пытаетесь скопировать два объекта модели, которые не могут быть выполнены, поскольку unique_ptr не копируется.