Я новичок в умных указателях, и я в процессе удара по каждому камню преткновения.
У меня есть структура texture_t
:
struct texture_t
{
hash32_t hash;
uint32_t width;
uint32_t height;
uint32_t handle;
};
Когда я пытаюсь сделать shared_ptr
этой структуры, используя эту строку:
auto texture_shared_ptr = std::make_shared<texture_t>(new texture_t());
Я получаю эту ошибку:
error C2664: 'mandala::texture_t::texture_t(const mandala::texture_t &)' : cannot convert parameter 1 from 'mandala::texture_t *' to 'const mandala::texture_t &'
Откуда эта ошибка и как ее избежать?
Вы не должны проходить new
указатель на std::make_shared
. Вам просто нужно передать аргументы, из которых texture_t
может быть построен к нему.
Точка std::make_shared<T>(args...)
это выделить T
объект, построенный с параметрами args...
, Идея этой операции заключается в том, что std::shared_ptr<T>
концептуально поддерживает два выделенных объекта:
T
,std::shared_pt<T>
и количество std::weak_ptr<T>
объекты, ссылающиеся на объект.При построении std::shared_ptr<T>
конструктор выполняет второе выделение, чтобы создать запись для своего внутреннего учета. std:make_shared<T>(args...)
делает только одно выделение памяти.
Ошибка, которую вы увидели, является результатом попытки создать mandala::texture_t
используя mandala::texture_t*
но единственный аргумент конструктор mandala::texture_t
has является конструктором копирования. Однако указатель не квалифицируется как аргумент конструктора копирования.