(使用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
变量是第三类的类成员(独立于Foobar
和Baz
)。
答案 0 :(得分:10)
那应该是;
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(myBaz);
...因为make_shared通过运行构造函数为你构造实际对象。