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

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声明使基类版本可用:

// In GDrawablePtr
using GPtr::operator=;

10-08 08:28