我使用的是SDL,遇到了一个我无法解决的问题。我想保持纹理(指向结构的指针)在std::map
中,我使用std::string
作为关键字,std::unique_ptr<texture, void(*)(texture*)>
作为值。我必须使用std::unique_ptr
中的删除器,因为纹理必须由某个函数释放。纹理也是由另一个函数创建的。我简化了代码,我下面有:为什么我不能用deleter创建这个unique_ptr?
#include <map>
#include <memory>
int* new_int(){ return new int; }
void delete_int(int* p){ delete p; }
typedef std::unique_ptr<int, void(*)(int*)> int_ptr;
int main()
{
std::map<int, int_ptr> the_map;
the_map[1] = int_ptr(new_int(), delete_int);
return 0;
}
当我尝试编译在Visual Studio 2012这个代码中,我得到以下错误:
error C2338: unique_ptr constructed with null deleter pointer.
,我觉得奇怪,因为我提供delete_int
作为删除指针。 欢迎任何帮助,不同的方法也是如此。 在此先感谢!
元素'[n]'的构造需要def ault-constructible类型,其中'unique_ptr'不是一个。考虑使用'.insert()'来代替'value_type'实例化。像'the_map.insert(std :: map :: value_type(1,int_ptr(new_int(),delete_int)));' –
WhozCraig
@WhozCraig'map :: emplace'是恕我直言的首选解决方案,请参阅我编辑的答案。 –