首頁 >後端開發 >C++ >為什麼我無法存取模板派生類別中基底類別的受保護成員?

為什麼我無法存取模板派生類別中基底類別的受保護成員?

Barbara Streisand
Barbara Streisand原創
2024-11-01 11:38:02216瀏覽

Why Can't I Access Protected Members of My Base Class in a Template Derived Class?

了解模板繼承和非依賴名稱查找

考慮以下程式碼片段:

<code class="cpp">// arrayListType.h
template <class elemType>
class arrayListType {
protected:
    elemType *list;
    int length;
};

// unorderedArrayListType.h
template <class elemType>
class unorderedArrayListType: public arrayListType<elemType> {
};

// main1.cpp
unorderedArrayListType<int> intList(25);</code>

編譯此程式碼結果報錯:“length was notclarified in thisscope”,說明父類別arrayListType的受保護變數在繼承類別unorderedArrayListType中不可見。

這是由於一個概念稱為非依賴名稱查找,它定義編譯器如何解析對模板內非依賴名稱的參考。非依賴名稱是那些不依賴模板參數的名稱,例如成員變數或成員函數名稱。

在這種情況下,arrayListType 中的受保護變數是非依賴名稱,並且它們沒有明確地表示在 unorderedArrayListType 類別定義中定義。編譯器無法確定這些名稱存在於繼承的類別中,因此會報告錯誤。

修正錯誤

解決此錯誤有兩種常見方法:

使用這個->前綴:

使用這個->前綴:

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    void insertAt(int location, const elemType& insertItem) {
        this->length++;
        this->list[location] = insertItem;
    }
};</code>

用此前綴非依賴名稱->明確指示它們引用繼承的成員:

使用聲明:

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    using arrayListType<elemType>::list;
    using arrayListType<elemType>::length;

    void insertAt(int location, const elemType& insertItem) {
        length++;
        list[location] = insertItem;
    }
};</code>

使用聲音明顯式聲明繼承類別中的非依賴名稱:

這兩種方法都可以有效地向編譯器傳達非依賴名稱屬於繼承類別的訊息,並允許編譯成功進行。

以上是為什麼我無法存取模板派生類別中基底類別的受保護成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn