我无法理解为什么以下代码在编译时因“返回临时引用”而失败。对我来说,单身人士不可能是暂时的,因为它是静止的!?
由于
#include <memory>
class Parent {
public:
static const std::shared_ptr<Parent>& get_default_value();
static const std::shared_ptr<Parent>& get_some_other_value();
};
class Child: public Parent {
public:
Child(){}
static const std::shared_ptr<Child>& singleton;
};
const std::shared_ptr<Child>& singleton = std::make_shared<Child>();
const std::shared_ptr<Parent>& Parent::get_default_value() {
return singleton;
}
const std::shared_ptr<Parent>& Parent::get_some_other_value() {
//FILL ME
}
编辑:父的默认值是Child的单身。 (之前还有其他一些名字,但这很令人困惑)。
编辑2:我也希望引用shared_pointers,因为默认情况发生了很多并且无论如何都是单例,所以也可以节省空间
编辑3:我想要一个std :: shared_ptr&amp;作为一种类型的结果,因为我希望界面与默认值和其他值
一致编辑4:由于无关原因,其他值需要为shared_ptr&lt;&gt;。
答案 0 :(得分:4)
您的问题是Child::singleton
类型为std::shared_ptr<Child>&
,但get_singleton
返回std::shared_ptr<Parent>&
。 std::shared_ptr<Child>
可以转换为std::shared_ptr<Parent>
但不能转换为std::shared_ptr<Parent>&
,因此必须创建std::shared_ptr<Parent>
类型的临时对象并返回对该引用的引用。
无论如何,通常没有理由通过引用返回shared_ptr
。只需按值返回它就会编译。
答案 1 :(得分:2)
没有单身人士是你宣布它的临时方式。声明静态变量:
const std::shared_ptr<Child>& Child::singleton = std::make_shared<Child>();
注意Child::
?另外在函数get_singleton中使用:
const std::shared_ptr<Parent>& Parent::get_singleton() {
return Child::singleton;
}
答案 2 :(得分:0)
根据Dirk的分析,转换是问题所在,这是一个很好的解决方案:
class Parent {
public:
static const std::shared_ptr<Parent>& get_singleton();
};
class Child: public Parent {
public:
Child(){}
static const std::shared_ptr<Parent>& singleton;
};
const std::shared_ptr<Parent>& singleton = std::make_shared<Child>();
const std::shared_ptr<Parent>& Parent::get_singleton() {
return singleton;
}