将派生类的std :: shard_ptr转换为基类的std :: shard_ptr

时间:2017-09-15 23:36:33

标签: c++ c++11 pointers inheritance shared-ptr

#include <iostream>
#include <memory>

class Base{
};
class Derive : public Base{
};

void foo(std::shared_ptr<Base>& p){
}
void bar(const std::shared_ptr<Base>& p){
}

int main(){

    auto base = std::make_shared<Base>();
    foo(base);
    bar(base);

    auto derive = std::make_shared<Derive>();
    foo(derive);
    bar(derive);

    return 0;
}
  

g ++ -std = c ++ 0x test.cpp

编译器说:

test.cpp:21:5: error: no matching function for call to 'foo'
    foo(derive);
    ^~~
test.cpp:9:6: note: candidate function not viable: no known conversion from 'std::__1::shared_ptr<Derive>' to
      'std::shared_ptr<Base> &' for 1st argument
void foo(std::shared_ptr<Base>& p){

你能解释为什么你不能将派生类的shared_ptr传递给foo(),你可以将它传递给接收shared_ptr的const引用的bar()。

抱歉我的英语不好。 感谢。

1 个答案:

答案 0 :(得分:1)

调用foo(derive)需要从std::shared_ptr<Base>构造临时derive,并且非const左值引用不能绑定到临时对象。要致电foo,您需要构建一个可以传递给它的命名std::shared_ptr<Base>

auto derive = std::make_shared<Derive>();
std::shared_ptr<Base> b = derive;
foo(b);

bar(derive)没问题,因为const引用可以绑定到临时引用。未命名的临时std::shared_ptr<Base>derive构成,对该临时的引用传递给bar