这是我的Mesh对象类
struct texture
{
std::string textureName;
unsigned int textureId;
};
class Mesh
{
public:
/* Mesh data */
std::vector<texture> textures;
/* Functions */
Mesh(std::vector<texture> &text);
Mesh(const Mesh& mesh) = delete;
Mesh& operator = (const Mesh& mesh) = delete;
Mesh(Mesh &&other);
Mesh& operator=(Mesh &&other);
~Mesh();
};
#include "Mesh.h"
Mesh::Mesh(std::vector<texture> &text) : textures(text)
{
}
Mesh::Mesh(Mesh &&other) : textures( other.textures)
{
for (auto &tex : other.textures)
tex.textureId = 0;
}
Mesh& Mesh::operator=(Mesh &&other)
{
if (this != &other)
{
textures = other.textures;
}
for (auto &tex : other.textures)
tex.textureId = 0;
return *this;
}
Mesh::~Mesh()
{
for (auto &tex : textures)
glDeleteTextures(1, &tex.id);
}
现在我意识到我需要为这个类对象创建一个共享指针,但是当我尝试这样做时,它给了我一个错误,试图引用一个删除的函数,我相信这是因为我使用了移动语义。
std::vector< texture> textures;
Mesh m(textures);
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(m);
有没有可能从具有移动语义的类对象中创建一个共享指针?
错误消息
错误C2280“Mesh::Mesh(const Mesh&)”:试图引用已删除的函数
如果添加移动构造函数,则默认的复制构造函数将隐式删除,std::make_shared
将使用复制构造函数。 这就是为什么您会得到如下错误消息的原因:
error: use of deleted function 'constexpr Mesh::Mesh(const Mesh&)'
-> decltype(::new((void*)0) _Tp(std::declval<_Args>()...))
note: 'constexpr Mesh::Mesh(const Mesh&)' is implicitly declared as deleted
because 'Mesh' declares a move constructor or move assignment operator
如果确实要移动,需要使用std::move
:
Mesh m(textures);
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(std::move(m));
但是对于所显示的代码,您根本不清楚为什么要执行移动,因为您似乎没有将M
用于其他任何事情。
make_shared
使用参数构造网格
。 你要么想
std::shared_ptr<Mesh> myMesh2 = std::make_shared<Mesh>(std::move(m));
或
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(textures);
从两个未删除的构造函数中选择一个。