2011-11-26 34 views
1

我实现一个HashTable模板类在C++和它的原型是这样的:如何与许多参数类型专门的模板类中只有一个方法

template<class K, class T, unsigned int containerSize=CONTAINER_SIZE> 
class LPHashTableChained{ 
    ........ 

    unsigned int hashFunction(K& key); 

} 

我的问题是我怎么能专注我的hashFunction()方法在K等于字符串类型时表现不同。

我试图与它的正确的格式,并与第二实施方案,其中我省略class K参数来实现功能,并把字符串作为像下面的类型:

月1日实施:

template<class K, class T, unsigned int containerSize> 
unsigned int LPHashTableChained<K,T,containerSize>::hashFunction(K& key){ 

} 

2日实施:

template<class T, unsigned int containerSize> 
unsigned int LPHashTableChained<string,T,containerSize>::hashFunction(const string& key){ 

} 

但我得到编译错误!

K= string被指定时,最简单的方法是什么hashFunction ???

谢谢

+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; 
+0

你意味着改变类声明如下: 模板<类K,T级,类型名散列=标准::散列,无符号整型containerSize = CONTAINER_SIZE> 类LPHashTableChained { \t ..... }; 并通过专门的哈希你是什么意思?我从来没有用过这个。 –

+0

@LambrosPetrou:是的,类似的东西。 –

+0

哈希器怎么样?我如何重载?它是否已经在标准库中,我只需要重载字符串类型? –

相关问题