派生模板類別中標識符的可見性有限
在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(); };
編譯此程式碼時,GCC g 3.4.4 (cygwin) 產生錯誤,因為 Derived 無法從其基底類別 Base 存取 NO_ZEROFILL。這是因為在模板實例化的第一階段,編譯器解析程式碼時,並沒有為T分配具體的類型,因此無法確定Derived繼承的具體Base類,因此無法解析定義的標識符在基類中。
為了克服此限制,在存取衍生範本類別中的基底類別識別碼時需要明確限定。下面的程式碼解決了這個問題:
template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = Base<T>::NO_ZEROFILL); // Explicit qualification ~Derived(); };
透過使用Base
因此,在派生模板類別中,基底模板類別中定義的標識符只能透過明確限定來訪問,從而確保模板在運行時正確解析用特定類型實例化。
以上是為什麼 C 語言的衍生模板類別中的基類標識符不可存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!