2013-03-04 3 views
1

Я пытаюсь использовать std::unique_ptr с deleter. Это мой код:unique_ptr с deleter

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: 'пустота станд :: вектор < _Ty> :: push_back (станд :: unique_ptr & &)': не удается преобразовать параметр 1 из «станд :: unique_ptr < _Ty, _Dx>»на 'станд :: unique_ptr < _Ty> & &'

Компилятор: VC++ 2012. Как я могу это исправить? Моя цель - использовать unique_ptr с пользовательским делетером, который вызывает delete[], а не по умолчанию delete.

+0

какой-либо причине вы не используете 'вектор ' или 'вектор >'? –

ответ

7

Нет необходимости, поскольку unique_ptr уже знает о массивах!

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

Специализация массива даже дает вам доступ к массиву и агрегирует; л p[0] = 'a'; т.д.

Вашего вектор типа должен соответствовать, конечно: std:vector<std::unique_ptr<char[]>>

3

unique_ptr<char> и unique_ptr<char, Deleter<char>> два различных типа. Таким образом, вы должны объявить вектор как:

vector<unique_ptr<char, Deleter<char>>> v;