下面的C++代码不能编译: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 &)
时,它已经继承Base<Derived>
T &operator (const T &) where [T = Derived]
。我可以理解为什么默认的拷贝赋值运算符通常会被创建,并覆盖任何继承赋值运算符,但在这种情况下Derived
被继承的操作与完全相同的签名的拷贝赋值运算符。有没有办法写BaseB
以便它的子类使用这个操作符?
我不确定这个错误与您的问题有何关系。你得到这个错误是因为你声明了这个函数,但从来没有定义它。 – 2013-04-24 03:56:53
由于您只声明了BaseA&operator =',因此编译器非常正确。将其更改为'BaseA&operator =(const BaseA&rhs)= default;'并且它会很愉快地编译。 – Yuushi 2013-04-24 03:58:19
链接器不应该关心它没有被定义,因为它永远不会被调用。它会被调用的唯一原因是编译器正在生成它自己的Derived :: operator =(const Derived&)函数。 – Shum 2013-04-24 04:01:06