簡體   English   中英

一個專用模板類可以繼承另一個專用模板類嗎?

[英]Can a Specialized Template Class Inherit from Another Specialized Template Class?

我首先定義

class Hash
{

};

然后是Hash的專業化。

template <class T>
class Hash<int, T>
{
public:
    Hash(int slotN = 11);

    bool insert(int key, T val);
    bool remove(int key);
    bool contains(int key);
    bool query(int key, T& val) ;

protected:
    // Basic Variables of the Hash Model.
    list<int>* slot;
    list<T>* slotVal;
    int slotN;
};

我想使用這個特殊版本的 Hash 來實現另一個特殊化:字符串值鍵的哈希。

template <class T>
class Hash<string, T> : public Hash<int, T>
{
public:
    Hash(int slotN);

    bool insert(string key, T val);
    bool remove(string key);
    bool contains(string key);
    bool query(string key, T& val) ;

private:

    // Calculate the String's Hash Key.
    int str2key( string key);
};

但似乎我無法訪問類 Hash 中的字段。 為什么?

當您說“我無法訪問類 Hash 中的字段”時,我猜您的意思是,當您使用Hash<string, T> (對於某些類型T )時,您無法從Hash<int, T>調用重載函數. 這樣做的原因是名稱隱藏:當您在派生類中重載成員函數時,基類中所有具有相同名稱的成員都將被隱藏,除非您明確使它們可用。 這樣做的方法是using聲明:

template <class T>
class Hash<string, T> : public Hash<int, T>
{
public:
    Hash(int slotN);

    using Hash<int, T>::insert;
    using Hash<int, T>::remove;
    using Hash<int, T>::contains;
    using Hash<int, T>::query;

    bool insert(string key, T val);
    bool remove(string key);
    bool contains(string key);
    bool query(string key, T& val) ;

private:

    // Calculate the String's Hash Key.
    int str2key( string key);
};

如果您只需要從派生類的實現中訪問基類成員,您還可以使用帶有類名的限定來訪問名稱。 例如:

template <typename T>
bool Hash<string, T>::insert(string key, T val) {
    return this->Hash<int, T>::insert(this->str2key(key, val);
}

進一步思考這個問題,還有另一個潛在問題:如果您訪問基類中的數據成員,您需要確保編譯器將該名稱視為依賴名稱。 否則,它會在第一階段查找,而不會在基礎中查找名稱,因為只能在第二階段找到:

template <typename T>
bool Hash<string, T>::insert(string key, T val) {
    int n0 = slotN; // doesn't work: looked up in phase 1
    int n1 = this->slotN; // OK: name is dependent
    int n2 = Hash<int, T>::slotN; // OK, too
}

就個人而言,我不會公開從具有不同密鑰的類派生,但我認為您有自己的理由。 順便說一句,我假設您對Hash的主要聲明看起來像這樣,盡管這對問題無關緊要,實際上:

template <typename K, typename T>
class Hash;

(如果它沒有任何成員,我也寧願不定義它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM