gpt4 book ai didi

c++ - 一个专用模板类可以从另一个专用模板类继承吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:23 25 4
gpt4 key购买 nike

我先定义

class 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实现另一个特化:Hash of字符串值键。

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);
}

进一步思考这个问题,还有另一个潜在的问题:如果您访问基类中的数据成员,您需要确保编译器将名称视为从属名称。否则它会在第一阶段查找并且不会在 base 中查找名称,因为只能在第二阶段找到:

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
}

就个人而言,我不会公开派生自具有不同 key 的类,但我假设您有自己的理由。顺便说一句,我假设你的主要声明是 Hash看起来像这样,虽然这对问题来说并不重要,真的:

template <typename K, typename T>
class Hash;

(如果它没有任何成员,我也宁愿不定义它)。

关于c++ - 一个专用模板类可以从另一个专用模板类继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13432168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com