在子类中重载基类赋值运算符会导致模糊的赋值错误

时间:2013-04-23 14:25:14

标签: c++ operator-overloading

我有这个基类(删除了详细信息)

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;
    }
*/
};

在注释掉该代码后,我在分配实例时会收到有关模糊赋值的编译错误。如果我取消注释它,那么即使它似乎没有做任何新的事情,编译也是成功的。

有没有办法避免重新定义原始的基本赋值运算符,这种行为的原因是什么?

1 个答案:

答案 0 :(得分:5)

它被称为隐藏:在派生类中声明一个函数会使基类中具有相同名称的任何函数都不可访问。您可以使用 using-declaration 来使基类版本可用:

// In GDrawablePtr
using GPtr::operator=;