簡體   English   中英

在子類類中重載基類賦值運算符會導致模棱兩可的賦值錯誤

[英]Overloading baseclass assignment operator in subclass class leads to ambiguous assignment error

我有這個基類(細節已刪除)

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=;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM