如何使用自定义delete给unique_ptr赋值



我试图将一个指针传递给一个函数,然后将一个结构体内部的unique_ptr设置为传入的指针。然而,在函数的最后一行,我得到了以下编译错误:

error C2280: 'std::unique_ptr<ALLEGRO_BITMAP,>祝辞::unique_ptr (const std:: unique_ptr<ALLEGRO_BITMAP,>比;&)':试图引用已删除的函数

c:program files (x86)microsoft visual studio 12.0vcincludememory(1486):参见` std::unique_ptr<ALLEGRO_BITMAP,>祝辞::unique_ptr '

此诊断发生在编译器生成的函数'Skin::Skin(const Skin &)'

从错误判断,我相信这与我将ALLEGRO_BITMAP的删除模板添加到命名空间std有关,但我不知道为什么或如何修复它。

using namespace std;
namespace std {
template<>
class default_delete < ALLEGRO_BITMAP > {
public:
    void operator()(ALLEGRO_BITMAP* ptr) {
        al_destroy_bitmap(ptr);
    }
};
}
typedef struct {
    unique_ptr<ALLEGRO_BITMAP> img;
} Skin;
typedef struct {
    Skin skins[MAX_ENTITY_COUNT];
} World;
unsigned int createBlock(World world, ALLEGRO_BITMAP* img) {
    unsigned int entity = newEntityIndex(world);
    world.skins[entity].img = make_unique<ALLEGRO_BITMAP>(img);
    return entity;
} // error on this line

任何帮助都是感激的。谢谢。

在您的createBlock函数中,您按值取World,这意味着它将被复制。然而,你不能复制unique_ptr,所以这就是你的错误来自哪里。这也意味着在函数中设置unqiue_ptr不会有任何效果。

你应该使用World:

unsigned int createBlock(World& world, ALLEGRO_BITMAP* img) {
    unsigned int entity = newEntityIndex(world);
    world.skins[entity].img = make_unique<ALLEGRO_BITMAP>(img);
    return entity;
}

注意,对newEntityIndex的调用也是如此,make_unique的参数将传递给ALLEGRO_BITMAP的构造函数。

所以你可能想要的是:

world.skins[entity].img.reset(img);

最新更新