Ошибки в 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 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 ).

6
задан Community 23 May 2017 в 12:06
поделиться