如何使用自定义delete给unique_ptr赋值
How to assign a unique_ptr with a custom deleter
我试图将一个指针传递给一个函数,然后将一个结构体内部的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);
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- 在C++中为空 ptr 到 ptr 赋值