1

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

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

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

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

4

1 回答 1

5

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

// In GDrawablePtr
using GPtr::operator=;
于 2013-04-23T14:37:42.463 回答