以下 C++ 代码无法编译:
class BaseA {
protected:
BaseA &operator = (const BaseA &rhs);
};
template<typename T>
class BaseB {
public:
T &operator = (const T &rhs) {
return *static_cast<T *>(this);
};
};
class Derived :
public BaseA,
public BaseB<Derived> {
};
int main() {
Derived foo;
Derived bar;
foo = bar;
return 0;
};
当我尝试编译它时,我收到一个BaseA &BaseA::operator = (const BaseA &)
未定义的投诉。在 stackoverflow 上还有其他几个类似的问题,但是它们似乎都与编译器自动生成Derived &Derived::operator = (const Derived &)
调用BaseA::operator = (const BaseA&)
. 在这种情况下,虽然Derived
应该已经从BaseB<Derived>
. 如果我按照另一个问题的建议并添加using BaseB<Derived>::operator =;
到Derived
编译器抱怨Derived &operator = (const Derived &)
不能重载。
一个类根本不可能继承这个运算符吗?
编辑:要清楚,我很困惑为什么编译Derived
器Derived &operator = (const Derived &)
已经T &operator (const T &) where [T = Derived]
从Base<Derived>
. 我可以理解为什么通常会创建默认的复制赋值运算符并覆盖任何继承的赋值运算符,但在这种情况下Derived
,它继承了一个与其复制赋值运算符具有完全相同签名的运算符。有没有办法BaseB
让它的子类使用这个运算符?