2013-04-25 98 views
1

鏈接到我的其他問題(Can I make an assignment operator on a base class that returns sub-class type)我有這樣的結構,這個想法是我希望得到專門的類型從GPtrBase,而無需每次都重新寫一個賦值操作符:當我專門喜歡遞歸模板模式;何時完成?

template<class BaseType,class Self> 
class GPtrBase 
{ 
public: 
    ... 

    Self& operator=(const BaseType& rhs) 
    { 
     ... 
     return *this; 
    } 

}; 

然而:

class GDrawablePtr : public GPtrBase<MyDrawable,GDrawablePtr>

我得到的錯誤:

「迴歸」:不能從轉換「GPtrBase <基地,自>」到「GDrawablePtr &」

我想基於使用的專業化生成一個模板類,所以不宜*this是在首位輸入GDrawablePtr

更新:我注意到,如果我添加using GPtrBase::operator=;它,然後工作,即使GDrawablePtr絕對不會定義任何運營商。

+0

您發佈的代碼原樣:http://ideone.com/4grkfv – SomeWittyUsername 2013-04-25 11:46:12

+0

@icepack非常奇怪。 Eiter這是我的編譯器(VC++ 2005)的一個怪癖,或者完整代碼的一些細節應該歸咎於它。我會用較簡單的版本進行調查來檢查。 – 2013-04-25 12:03:02

+0

@icepack不,它不。由於其參數的類型,「operator =」會被忽略。請參閱http://ideone.com/EWrVAh的程序輸出。由於不需要,編譯器不會嘗試編譯它,因此缺少錯誤消息。 – NonNumeric 2013-04-25 17:34:39

回答

2

相較於動態多態性在終場thisvirtual功能爲基礎自動垂頭喪氣派生,你需要使用一個明確的static_cast派生類

template<class BaseType,class Self> 
class GPtrBase 
{ 
public: 
    ... 

    Self& operator=(const BaseType& rhs) 
    { 
     ... 
     return static_cast<Self&>(*this); 
    } 

}; 
0

我想到了一個模板類是基於所使用的特化生成的,所以不應該*這是GDrawablePtr類型的第一位?

看來你把更多的模板實例化比實際存在。類模板就是這樣的:一個模板,當給出它的參數時就會生成一個類。它不以任何其他方式將模板參數綁定到結果類。

特別是,您在實例化點從實例化類繼承的事實不會更改類定義中的任何內容。它仍然是獨立的類,雖然有它自己的類型(儘管有些複雜),因此它與沒有模板機制定義的任何其他基類沒有區別。例如,不管基類或子類是如何創建的,不存在從指針到基類到指向其任何子類的指針的隱式轉換。