Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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++ 如何使用std::make_shared创建基类类型的智能指针?_C++ - Fatal编程技术网

C++ 如何使用std::make_shared创建基类类型的智能指针?

C++ 如何使用std::make_shared创建基类类型的智能指针?,c++,C++,我做错了什么?我不敢相信下面的内容没有编译。您需要使用共享指针强制转换还是什么 struct Base { }; class Child : Base { }; int main() { std::shared_ptr<Base> p = std::make_shared<Child>(); } struct Base { }; 类子:基 { }; int main() { std::shared_ptr p=std::make_shared(); } 我

我做错了什么?我不敢相信下面的内容没有编译。您需要使用共享指针强制转换还是什么

struct Base
{
};

class Child : Base
{
};

int main()
{
    std::shared_ptr<Base> p = std::make_shared<Child>();
}
struct Base
{
};
类子:基
{
};
int main()
{
std::shared_ptr p=std::make_shared();
}
我在Microsoft编译器中遇到的错误是

error C2440: 'initializing': cannot convert from 'std::shared_ptr<Child>' to 'std::shared_ptr<Base>'
错误C2440:“正在初始化”:无法从“std::shared_ptr”转换为“std::shared_ptr”

它确实有效。只是
Base
具有
private
继承

struct Child : Base{};


这些都是修复方法。有趣的是,
std::static\u pointer\u cast
和company确实存在;但是你在这里不需要它们。请参见

您应该改用公共继承:

class Child : public Base
{
};
虽然’和’的答案解决了这个问题,但没有人解释为什么这是解决方案,我认为未来的观众了解为什么这是这个问题很重要

当您试图创建指向基类
base
的指针时,您试图访问属于派生类的基类的所有公共成员(在本例中为
子类
)。如果派生类私有继承基类(或受保护继承它),则派生类内基类中标记为公共的所有成员现在都标记为私有(或受保护)。这意味着试图以公共成员身份访问它们将引发访问权限冲突问题。由于访问权限在编译时已知,因此这是一个编译错误


正如前面的响应中提到的,解决方法是使用公共继承来继承基类。哪个是
struct
s中的默认继承,哪个是
class
es中的非默认继承。

我认为您需要从
Base
中公开继承,但我认为该继承是公开的?您可以获得实现类的类型的默认访问修饰符。因此,如果执行
类子类…
,则默认值为私有,如果执行
结构子类…
则默认值为公共。否,因为子类是
,继承默认值为
私有
,就像成员变量和函数一样,这里不需要std::static\u pointer\u cast,因为我们正在强制转换do基类(在层次结构中向上),对吗?我假设规则与“普通”
static_cast
的规则相同,如果我们从另一个方向进行铸造,即从
Base
派生
,则需要使用该规则我在这个网站上添加了…仅在这个页面上,我就多了3美元,加上美联储目前善于创造资金。
class Child : public Base
{
};