首頁 > 後端開發 > C++ > 為什麼派生模板類別不能直接存取基底模板類別標識符?

為什麼派生模板類別不能直接存取基底模板類別標識符?

DDD
發布: 2024-11-16 03:01:02
原創
885 人瀏覽過

Why Can't Derived Template Classes Access Base Template Class Identifiers Directly?

為什麼派生模板類別無法存取基本模板類別標識符

在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();
}
登入後複製

在此範例中,衍生類別 Derived 無法直接存取來自其基底類別 Base 的 NO_ZEROFILL 識別碼。這是因為,在模板定義階段,編譯器沒有實際的類型來取代 T。因此,它無法解析 Base 中定義的標識符。並要求它們使用基底類別名稱明確限定。

此行為可確保即使使用不同類型實例化類,模板類中標識符的含義也是明確定義的。 Base的每個實例都包含有自己的一組靜態成員“ZEROFILL”和“NO_ZEROFILL”,編譯器只會在使用特定類型參數實例化模板時驗證程式碼的有效性。

要解決所提供代碼中的問題,您可以使用基類名稱明確限定 NO_ZEROFILL 標識符,如下所示:

Derived( bool initZero = Base<T>::NO_ZEROFILL );
登入後複製

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

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