У меня есть примерно такой код:
std::unique_ptr<char[], decltype(&free)> information(malloc(arr_size),&free);
Но компилятор кидает исключение:
error: no matching function for call to ‘std::unique_ptr<char [], void (*)(void*) throw ()>::unique_ptr(void*, void (*)(void*) throw ())’
std::unique_ptr<char[], decltype(&free)>information(malloc(arr_size),&free);
Скажите, пожалуйста, почему происходит эта ошибка, и как её исправить?
Начиная с C++17 соответствующие конструкторы std::unique_ptr
являются шаблонными
template<class U> explicit unique_ptr( U p ) noexcept;
template<class U> unique_ptr( U p, /* ... */ d ) noexcept;
и, согласно http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr, эти конструкторы участвуют в overload resolution только в том случае, если выполняется одно из условий
U
совпадает с std::unique_ptr<>::pointer
U
- это std::nullptr_t
В вашем случае std::unique_ptr<>::pointer
- это char *
, а U
будет дедуцировано как void *
, что не соответствует ни одному из этих условий. Именно поэтому компилятор сообщает вам, что в данном случае нет подходящей функции для вызова.
В С++11 соответствующие конструкторы были нешаблонными и принимали первый параметр типа std::unique_ptr<>::pointer
, т.е. в вашем случае char *
. Эти функции не будут вызываемыми и в С++11 по той причине, что результат malloc
типа void *
не может быть неявно приведен к типу char *
.
Если же явно привести первый аргумент к char *
, то код должен скомпилироваться
std::unique_ptr<char [], decltype(&free)> information((char *) malloc(arr_size), &free);
Сделайте явное преобразование в нужный тип любым удобным образом:
std::unique_ptr<char[], decltype(&free)> information ((char*)malloc(arr_size), free);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите как в C++ вводить __float128, потом вывести без знаков после точки
Добрый деньПытаюсь решить одну задачу, надо, чтобы читались данные из файла