(Используя 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
).
make_shared()
вызывает для вас конструктор шаблонного типа, так что мне не следовало передаватьnew
объект. Спасибо! Повторите это еще раз как ответ, и я отмечу его как правильный. - person Bret Kuhns   schedule 09.01.2012