在子类类中重载基类赋值操作符会导致二义性赋值错误

Overloading baseclass assignment operator in subclass class leads to ambiguous assignment error

本文关键字:二义性 赋值 错误 赋值操作符 子类 重载 基类      更新时间:2023-10-16

我有这个基类(细节删除)

template<class T>
class GPtr
{
public:
    typedef T BaseType;
    GPtr& operator=(const BaseType& rhs)
    {
        m_p = rhs.get();
        return *this;
    }
private:
    BaseType m_p;
};

然后子类专门化模板并添加另一个赋值选项:

class GDrawablePtr : public GPtr<XYZ>
{
public:
    GDrawablePtr& operator=(const RootType& rhs)
    {
        GPtr::operator =(convert<BaseType::element_type>(rhs));
        return *this;
    }
/* -- only compiles if this is uncommented
    GDrawablePtr& operator=(const BaseType& rhs)
    {
        GPtr::operator =(rhs);
        return *this;
    }
*/
};

在注释掉该代码后,我在赋值实例时得到关于歧义赋值的编译错误。如果我取消注释,那么即使它看起来没有做任何新的事情,编译也是成功的。

是否有一种方法可以避免重新定义原始的基赋值操作符,这种行为的原因是什么?

这就是所谓的隐藏:在派生类中声明函数使得基类中同名的任何函数都无法访问。您可以使用using-declaration来使基类版本也可用:

// In GDrawablePtr
using GPtr::operator=;