Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试创建共享\u ptr时,std::make_shared()中出现错误?_C++_C++11_Shared Ptr_Visual C++ 2010_Make Shared - Fatal编程技术网

C++ 尝试创建共享\u ptr时,std::make_shared()中出现错误?

C++ 尝试创建共享\u ptr时,std::make_shared()中出现错误?,c++,c++11,shared-ptr,visual-c++-2010,make-shared,C++,C++11,Shared Ptr,Visual C++ 2010,Make Shared,(使用VisualStudio2010)我试图在我的项目中创建一个现有类的共享\u ptr(这个类是在std::shared\u ptr存在之前十年编写的)。这个类接受指向另一个对象的非常量指针,它的空参数构造函数是私有的 class Foobar { public: Foobar(Baz* rBaz); private: Foobar(); } 当我试图为它创建一个共享的ptr时,事情并不顺利: Baz* myBaz = new Baz(); std::shared_ptr

(使用VisualStudio2010)我试图在我的项目中创建一个现有类的共享\u ptr(这个类是在std::shared\u ptr存在之前十年编写的)。这个类接受指向另一个对象的非常量指针,它的空参数构造函数是私有的

class Foobar {
public:
    Foobar(Baz* rBaz);

private:
    Foobar();
}
当我试图为它创建一个共享的ptr时,事情并不顺利:

Baz* myBaz = new Baz();
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(new Foobar(myBaz));
出于某种原因,它似乎在调用
Foobar
的复制构造函数,而不是采用
Baz*
的构造函数

我也不确定
是否无法从'Foobar*'转换为'const Foobar'
部分。我最好的解释是我的
shared\u ptr
模板类型是错误的。我将其设置为
shared\u ptr
,但这似乎是错误的,我看到的所有示例都没有将该类型设置为原始指针

使所有
shared\u ptr
都能正确编译,但是当所有
shared\u ptr
都超出范围时,这会阻止
Foobar
对象被正确删除吗

编辑:这似乎相关,但我没有使用Boost:

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

这应该是

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

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

我无法测试atm,但这不应该;std::shared_ptr sharedFoo=std::make_shared(myBaz);啊!!这就成功了。。。显然
make_shared()
为您调用模板类型的构造函数,所以我不应该传入
新的
对象。谢谢再说一遍作为答案,我会将其标记为正确。完成后,我可以自己测试:)
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(myBaz);