(Используя Visual Studio 2010) Я пытаюсь создать shared_ptr существующего класса в моем проекте (класс был написан за десять лет до того, как существовал std :: shared_ptr). Этот класс принимает неконстантный указатель на другой объект, его пустой конструктор параметров является закрытым.
class Foobar {
public:
Foobar(Baz* rBaz);
private:
Foobar();
}
Когда я пытаюсь создать для него shared_ptr, все идет не так:
Baz* myBaz = new Baz();
std::shared_ptr sharedFoo = std::make_shared(new Foobar(myBaz));
На VS2010 это дает мне
error C2664: 'Foobar::Foobar(const Foobar &)' : cannot convert parameter 1 from 'Foobar *' to 'const Foobar &'
3> Reason: cannot convert from 'Foobar *' to 'const Foobar'
По какой-то причине он вызывает конструктор копирования Foobar
вместо конструктора, который принимает Baz *
.
Я также не уверен, что не может преобразовать часть 'Foobar *' в 'const Foobar'
. Моя лучшая интерпретация состоит в том, что мой шаблонный тип shared_ptr
неверен. Я сделал это shared_ptr
, но это кажется неправильным, все примеры, которые я видел, не делают тип необработанным указателем.
Кажется, что создание всего shared_ptr
компилируется правильно, но это предотвратит правильное удаление объекта Foobar
, когда все shared_ptr
выйти за рамки?
Edit: Это кажется связанным, но я не использую Boost: boost make_shared принимает константную ссылку. Есть ли способ обойти это?
Edit2: Для ясности, если вам интересно, почему я использую make_shared ()
, в моем фактическом коде sharedFoo
переменная является членом третьего класса (независимо от Foobar
и Baz
).