Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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::shared\u ptr<;派生>;到const shared_ptr<;基地>&;_C++ - Fatal编程技术网

C++ 转换std::shared\u ptr<;派生>;到const shared_ptr<;基地>&;

C++ 转换std::shared\u ptr<;派生>;到const shared_ptr<;基地>&;,c++,C++,如果我没有记错(并且根据),则无法将std::shared_ptr绑定到const std::shared_ptr&。但是当我尝试下面的代码时,它甚至没有给我任何警告 #include <memory> struct A{}; struct B:A{}; void Do(const std::shared_ptr<A>&){} template<typename T> struct C{}; void DoC(const C<A>&am

如果我没有记错(并且根据),则无法将
std::shared_ptr
绑定到
const std::shared_ptr&
。但是当我尝试下面的代码时,它甚至没有给我任何警告

#include <memory>
struct A{};
struct B:A{};

void Do(const std::shared_ptr<A>&){}

template<typename T>
struct C{};
void DoC(const C<A>&){}

int main()
{
    std::shared_ptr<B> b = std::make_shared<B>();
    Do(b); //accept ?
    /*following lines generate error
    C<B> c;
    DoC(c); //error
    //*/
}
#包括
结构A{};
结构B:A{};
voiddo(const std::shared_ptr和许多其他在线编译器


有什么我错过了吗?

std::shared\u ptr
有一个允许从
B
转换到
A

(摘自《参考文献》)

模板
共享\u ptr(常数共享\u ptr&r);
9) 构造一个
shared_ptr
,它共享由
r
管理的对象的所有权。如果
r
不管理任何对象,
*此
也不管理任何对象。如果
Y*
未隐式转换为
t*
,则模板重载不会参与重载解析



DoC(c)
给您一个错误,因为您没有定义一个进行转换的构造函数-不会隐式为您生成类似的构造函数。

std::shared\u ptr
具有允许从
B
转换到
a
的构造函数:

(摘自《参考文献》)

模板
共享\u ptr(常数共享\u ptr&r);
9) 构造一个
shared_ptr
,它共享由
r
管理的对象的所有权。如果
r
不管理任何对象,
*此
也不管理任何对象。如果
Y*
未隐式转换为
t*
,则模板重载不会参与重载解析



DoC(c)
给你一个错误,因为你没有定义一个进行转换的构造函数-类似的构造函数不会隐式为你生成。

@KerrekSB我不确定我是否理解。那么为什么
DoC(c)
会给我错误?@appleapple:因为
c
不知道如何转换成
c
(其中
c
也不知道如何从
c
构造)它们是不相关的,而
shared_ptr
shared_ptr
不是不相关的。@像素化学家你能告诉我我的问题和我链接的问题之间的区别吗?我找不到我错过的地方。在
共享的例子中没有区别。我想@KerrekSB把你搞错了。另一个问题是相当错误的,因为你实际上可以将
shared\u ptr
转换为
shared\u ptr const&
(在我尝试过的任何最新编译器上)。@Pixelchemist:是的,是的,无论如何评论都太模糊了。@KerrekSB我不确定我是否理解。那么为什么
DoC(c)
会给我错误?@appleapple:因为
c
不知道如何转换成
c
(其中
c
也不知道如何从
c
构造)它们是不相关的,而
shared_ptr
shared_ptr
不是不相关的。@像素化学家你能告诉我我的问题和我链接的问题之间的区别吗?我找不到我错过的地方。在
共享的例子中没有区别。我想@KerrekSB把你搞错了。另一个问题是相当错误的,因为你实际上可以将
shared\u ptr
转换为
shared\u ptr const&
(在我尝试过的任何最新编译器上)。@Pixelchemist:是的,是的,不管怎样,注释都太模糊了。
template< class Y > 
shared_ptr( const shared_ptr<Y>& r );