Ошибки в std :: make_shared () при попытке сделать shared_ptr? - PullRequest
6 голосов
/ 09 января 2012

(с использованием 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).

1 Ответ

10 голосов
/ 09 января 2012

Это должно быть;

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

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

...