6

(使用 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*>但这似乎是错误的,我见过的所有示例都没有使类型成为原始指针。

似乎使所有内容都可以正确编译,但是当 all超出范围时shared_ptr<Foobar*>,这会阻止Foobar对象被正确删除吗?shared_ptr

编辑:这似乎相关,但我没有使用 Boost:boost make_shared 接受 const 引用。有什么办法可以解决这个问题?

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

4

1 回答 1

10

那应该是;

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

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

于 2012-01-09T14:17:47.363 回答