Error: (One function) cannot be overloaded with (other function)

Error: (One function) cannot be overloaded with (other function)

我有以下 class 结构:

class DBData
{

    public:

    DBData();

    virtual
    ~DBData() = 0;

    virtual
    DBData* Clone() const = 0;

    virtual
    std::unique_ptr<DBData>& Clone() const = 0;

};

这不会编译,编译器对象会出现以下错误消息:

error: ‘virtual std::unique_ptr<DBData>& DBData::Clone() const’ cannot be overloaded with ‘virtual DBData* DBData::Clone() const’

为什么会出现这个错误?我的猜测是它与 return 类型是引用或指针(在某些方面相似)有关。

或者可能 unique_ptr 与原始指针太相似了,但这对我来说似乎没有多大意义。

明显的解决方案:

显而易见的问题显而易见的解决方案。应该意识到这一点。从 operator++ 中汲取灵感:

virtual
std::unique_ptr<DBData>& Clone(int dummy = 0) const = 0;

或者更好,只是重命名它:

virtual
std::unique_ptr<DBData>& CloneUniquePtr() const = 0;

编辑: 不 - 这也不起作用。

原因是这个

virtual
std::unique_ptr<DBDataDerived>& CloneUniquePtr() const;

是一个 invalid covariant return type。鉴于这是一个引用类型,我认为这应该没问题。是不是只有原始指针可以是协变的 return 类型?

编辑 2:对于协变的类型(至少在这种情况下),它必须遵守 Liskov 替换原则。

似乎编写可编译的东西的唯一方法是:

std::unique_ptr<DBData> DBDataDerived::Clone() const;

这意味着根本不使用协变 return 类型。

问题 是我们不能仅根据 return 类型重载成员函数(或函数)。

这是因为重载决策考虑了函数的签名

defns.signature.member

signature 〈class member function〉 name, parameter type list (11.3.5), class of which the function is a member, cv-qualifiers (if any), and ref-qualifier (if any)

正如我们所见,return 类型不是成员函数签名的一部分。因此它(return 类型)不能用于重载成员函数。