1

我正在尝试与删除器一起使用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<_Ty>::push_back(std::unique_ptr &&)' : 无法将参数 1 从 'std::unique_ptr<_Ty,_Dx>' 转换为 'std::unique_ptr<_Ty> && '

编译器:VC++ 2012。我该如何解决这个问题?我的目标是unique_ptr与调用delete[]而不是 default的自定义删除器一起使用delete

4

2 回答 2

8

没有必要,因为unique_ptr已经知道数组了!

std::unique_ptr<char[]> p(new char[10]);
sprintf(p.get(), "...");

数组专业化甚至为您提供类似数组的访问p[0] = 'a';等。

当然,您的矢量类型必须匹配:std:vector<std::unique_ptr<char[]>>

于 2013-03-04T09:30:52.827 回答
4

unique_ptr<char>并且unique_ptr<char, Deleter<char>>是两种不同的类型。因此,您应该将您的向量声明为:

vector<unique_ptr<char, Deleter<char>>> v;
于 2013-03-04T09:30:56.817 回答