衍生類別中無法存取的基本範本類別識別碼:兩階段尋找的情況
使用範本類別時,必須了解兩階段查找的含義。在 C 中,模板類別定義中的標識符在編譯期間不會完全解析。相反,它們在模板實例化期間根據提供的實際類型參數進行解析。這可能會導致衍生模板類別無法直接從其基底模板類別存取標識符的情況。
考慮以下範例:
template <typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; }; template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = NO_ZEROFILL); // NO_ZEROFILL is not visible ~Derived(); };
在此程式碼中,衍生範本類別繼承自基本範本類別。但是,在編譯此程式碼時,會發生錯誤,因為衍生類別嘗試使用基底類別中的 NO_ZEROFILL 標識符,而不用基底類別名稱對其進行限定。
此行為是由兩階段查找所引起的。在編譯的第一階段期間,編譯器處理模板定義而不用任何實際類型參數取代T。因此,編譯器無法確定Base
要解決此問題,您必須明確指定從基底模板類別存取識別碼時的基底類別名稱。這可以使用 Base
以上是為什麼派生模板類別不能直接存取基底模板類別的識別碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!