尝试创建shared_ptr时std :: make_shared()中的错误?

时间:2012-01-09 14:05:59

标签: c++ c++11 shared-ptr visual-c++-2010 make-shared

(使用Visual Studio 2010)我正在尝试在我的项目中创建现有类的shared_ptr(类是在std :: shared_ptr存在之前写的十年)。该类采用非const指针指向另一个对象,它的空参数构造函数是私有的。

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 takes in a const reference. Any way to get around this?

Edit2:为清楚起见,如果您想知道我为什么使用make_shared(),在我的实际代码中,sharedFoo变量是第三类的类成员(独立于FoobarBaz)。

1 个答案:

答案 0 :(得分:10)

那应该是;

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

...因为make_shared通过运行构造函数为你构造实际对象。