首頁 > 後端開發 > C++ > 為什麼 C 語言的衍生模板類別中的基類標識符不可存取?

為什麼 C 語言的衍生模板類別中的基類標識符不可存取?

Linda Hamilton
發布: 2024-11-19 00:10:02
原創
440 人瀏覽過

Why Are Base Class Identifiers Inaccessible in Derived Template Classes in C  ?

派生模板類別中標識符的可見性有限

在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::NO_ZEROFILL,明確指示編譯器在基類中查找標識符,即使T 的具體類型不是在此階段已知。

因此,在派生模板類別中,基底模板類別中定義的標識符只能透過明確限定來訪問,從而確保模板在運行時正確解析用特定類型實例化。

以上是為什麼 C 語言的衍生模板類別中的基類標識符不可存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板