class My {
public:
auto create(size_t size)->void;
auto empty()->bool;
auto print()->void;
size_t size;
shared_ptr<int> arr;
};
auto My::create(size_t size)->void {
this->arr = make_shared<int>(new int[size]);
this->size = size;
};
Имеется небольшой класс для создания массива обернутого в shared_ptr, при запуске возникает ошибка : "Невозможно преобразовать int* в int", не могу понять почему
Дело в том, что make_shared создаёт указатель на один объект, а параметры передаёт в конструктор. Т. е.
auto a = make_shared <int> (42);
это по сути представляет собой (хотя и немного эффективнее)
auto a = shared_ptr <int> (new int (42));
Похоже, что использовать для массивов его не удастся (что может быть вызвано различиями в выделении и освобождении памяти). Можно вместо массива использовать какой-нибудь класс, например, вектор.
make_shared будет (скорее всего) поддерживать создание shared_ptr, в котором хранится указатель на массив, со следующей версии C++. shared_ptr поддерживает такое создание уже сегодня, но для этого нужно иметь последний компилятор, поддерживающий этот функционал (студия на момент написания ответа этого не умеет).
this->arr = std::shared_ptr<int[]>(new int[size]);
Объединю решения вопроса для удобства:
1) ассоциация
2) используя reset
this->arr.reset(new int[size], std::default_delete<int[]>());
Сборка персонального компьютера от Artline: умный выбор для современных пользователей