我正在尝试将std::unique_ptr
与删除器一起使用。这是我的代码:
template<class T>
struct Deleter
{
void operator()(T* p)
{
delete[] p;
}
};
void Test()
{
vector<unique_ptr<char>> v;
for(size_t i = 0; i < 5; ++i)
{
char* p = new char[10];
sprintf(p, "string %d", i);
v.push_back( unique_ptr<char, Deleter<char>>(p) ); // error is here
}
}
错误C2664:'void std :: vector&lt; _Ty&gt; :: push_back(std :: unique_ptr&amp;&amp;)':无法从'std :: unique_ptr&lt; _Ty,_Dx&gt;'转换参数1到'std :: unique_ptr&lt; _Ty&gt; &安培;&安培;'
编译器:VC ++ 2012.我该如何解决这个问题?我的目标是将unique_ptr
用于调用delete[]
而非默认delete
的自定义删除工具。
答案 0 :(得分:8)
没有必要,因为unique_ptr
已经知道了数组!
std::unique_ptr<char[]> p(new char[10]);
sprintf(p.get(), "...");
数组专门化甚至可以为您提供类似于数组的访问,例如p[0] = 'a';
等。
您的矢量类型必须匹配,当然:std:vector<std::unique_ptr<char[]>>
答案 1 :(得分:4)
unique_ptr<char>
和unique_ptr<char, Deleter<char>>
是两种不同的类型。因此,您应该将矢量声明为:
vector<unique_ptr<char, Deleter<char>>> v;