我在C ++中实现了一个HashTable
模板类,它的原型是这样的:
template<class K, class T, unsigned int containerSize=CONTAINER_SIZE>
class LPHashTableChained{
........
unsigned int hashFunction(K& key);
}
我的问题是,当hashFunction()
等于字符串类型时,我如何专注于K
方法的行为方式。
我尝试使用正确的格式实现该函数,并使用第二个实现来省略class K
参数,并将字符串作为类型如下所示:
第一次实施:
template<class K, class T, unsigned int containerSize>
unsigned int LPHashTableChained<K,T,containerSize>::hashFunction(K& key){
}
第二次实施:
template<class T, unsigned int containerSize>
unsigned int LPHashTableChained<string,T,containerSize>::hashFunction(const string& key){
}
但是我收到编译错误!!!
在hashFunction
???
K= string
由于
答案 0 :(得分:5)
您不能部分专门化模板的成员函数。 (不过,总的专业化很好。)
您的类的最佳方法是按照标准库的方式执行,并将哈希函数作为“策略”类型模板参数提供:
template <typename K, typename V, typename Hash = std::hash<K>>
class HashTable
{
Hash hasher;
// use hasher(x)
};
现在您可以简单地为您的字符串类型专门设置哈希,或者提供您自己的:
// provide custom
struct MyInsaneHasher { std::size_t operator()(const Foo &) const; };
HashTable<Foo, int, MyInsaneHasher> m1;
// add specialization for `std::hash`:
namespace std
{
template <> struct hash<Bar> { size_t operator()(const Bar&) const; };
}
HashTable<Bar, int> m2;