-2

我不明白为什么以下代码在编译时失败并出现“返回对临时的引用”。对我来说单身不能是临时的,因为它是静态的!?

谢谢

#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
}

证明

编辑:父母的默认值是孩子的单例。(之前还有一些其他名称,但这很令人困惑)。

编辑2:我还想引用shared_pointers,因为默认情况很多而且无论如何都是单例,所以最好节省空间

编辑 3:我想要一个 std::shared_ptr& 作为类型结果,因为我希望接口对于默认值和其他值保持一致

编辑 4:由于不相关的原因,其他值需要 shared_ptr<>。

4

3 回答 3

4

您的问题是Child::singletontypestd::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通过引用返回 a 。只需按值返回,它就会编译。

于 2013-03-12T17:55:39.797 回答
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;
}
于 2013-03-12T17:48:52.813 回答
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;
}

证明

于 2013-03-13T08:27:14.407 回答