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 类型重载成员函数(或函数)。
这是因为重载决策考虑了函数的签名。
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 类型)不能用于重载成员函数。
我有以下 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 类型重载成员函数(或函数)。
这是因为重载决策考虑了函数的签名。
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 类型)不能用于重载成员函数。