在C 中,定義類模板時,在非限定名稱查找期間不會檢查基類範圍,如果基底類別依賴於模板參數。 C 標準的 14.6.2/3 中概述了此行為。
考慮以下程式碼:
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 };
在此範例中,B 類別繼承自 A 類別模板,其中包含類型別名 Vec_t。但是,在 B 類中,嘗試使用 Vec_t 而不完全限定它(即 A
要解決此問題,類型別名的名稱必須在B 類中完全限定:
template<typename T> class B : public A<T> { private: typename A<T>::Vec_t v; // correct - fully qualified name };
這是因為,在非限定名稱查找期間在類模板或其成員的定義中,如果基底類別依賴於範本參數,則不會檢查基底類別範圍。因此,有必要明確限定類型別名的名稱以避免編譯器錯誤。
以上是為什麼非限定名稱查找不能與 C 中的範本參數相關基底類別一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!