衍生類別的範本類型定義
在 C 中,範本允許定義泛型類別和資料結構。但是,將 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; // Error: Vec_t is not recognized };
在此範例中,類別 A 為 T 類型的向量定義了 typedef。 ,當嘗試在衍生類別 B 中使用此 typedef 時,會發生錯誤,因為 B 的作用域內無法辨識 Vec_t。
原因這個問題源自於 C 標準對模板基底類別範圍的處理。根據標準第14.6.2/3 節:
「在類別範本或類別範本成員的定義中,如果類別範本的基類依賴於範本參數,則在非限定名稱查找期間不會檢查基類別作用域...”
這表示在使用非限定名稱時,基底類別中定義的typedef 不會自動在衍生類別的作用域中可用。要解決此問題,typedef 必須是完全限定的:
typename A<T>::Vec_t v;
透過使用 typename 關鍵字後跟 typedef 的完全限定名稱,您可以明確指定要使用基底類別中的 typedef 。這將按預期工作,並允許您存取派生類別中的向量 typedef。
以上是如何在 C 中存取派生類別模板中的基底類別 Typedef?的詳細內容。更多資訊請關注PHP中文網其他相關文章!