Ошибки в std :: make_shared () при попытке сделать shared_ptr?

(Используя 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).


person Bret Kuhns    schedule 09.01.2012    source источник
comment
Я не могу проверить банкомат, но этого не должно быть; std :: shared_ptr ‹Foobar› sharedFoo = std :: make_shared ‹Foobar› (myBaz);   -  person Joachim Isaksson    schedule 09.01.2012
comment
Ах! Это сработало ... очевидно, make_shared() вызывает для вас конструктор шаблонного типа, так что мне не следовало передавать new объект. Спасибо! Повторите это еще раз как ответ, и я отмечу его как правильный.   -  person Bret Kuhns    schedule 09.01.2012
comment
Готово, после того, как смог проверить сам :)   -  person Joachim Isaksson    schedule 09.01.2012


Ответы (1)


Которые должны быть;

std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(myBaz);

... поскольку make_shared создает для вас фактический объект, запустив конструктор.

person Joachim Isaksson    schedule 09.01.2012