#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()。
抱歉我的英语不好。 感谢。
答案 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
。