在C 中,可以在基底類別中定義typedef 來為特定的物件提供方便的別名資料型態。但是,當使用基於模板的基類時,了解這些 typedef 到衍生類別的傳播機制至關重要。
考慮以下範例:
template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // fails - Vec_t is not recognized };
這裡,基底類別 A 為類型 T 的向量定義了一個名為 Vec_t 的 typedef。在衍生類別 B 中,當嘗試使用 Vec_t 而不完全限定它時(例如, typename A
C 標準 (14.6.2/3) 解釋了此行為。根據標準,「在類別範本或類別範本成員的定義中,如果類別範本的基底類別依賴於範本參數,則在非限定名稱尋找期間不會檢查基底類別範圍。」
因此,在在派生類別B 中,無法識別非限定標識符Vec_t,因為編譯器不會檢查基類範圍以進行非限定名稱查找。要正確存取 typedef,需要使用語法 typename A
以上是C 模板中的「typedef」類型傳播如何從基底類別傳播到衍生類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!