(с использованием 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<Foobar> sharedFoo = std::make_shared<Foobar>(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*
.
Я тоже не уверен насчет части cannot convert from 'Foobar *' to 'const Foobar'
.Моя лучшая интерпретация заключается в том, что мой шаблонный тип shared_ptr<Foobar>
неверен.Я сделал это shared_ptr<Foobar*>
, но это кажется неправильным, все примеры, которые я видел, не делают тип необработанным указателем.
Кажется, что все shared_ptr<Foobar*>
компилируется правильно, но это помешает Foobar
объект удаляется должным образом, когда все shared_ptr
выходят из области видимости?
Редактировать: Это кажется связанным, но я не использую Boost: boost make_sharedпринимает постоянную ссылку.Есть ли способ обойти это?
Edit2: Для ясности, если вам интересно, почему я использую make_shared()
, в моем реальном коде переменная sharedFoo
является членом класса третьего класса (независимо от Foobar
и Baz
).