#include <exception>
#include <stdexcept>
#include <string>
#include <iostream>
using namespace std;
//类模板
template <typename T>
class DefaultHash {
public:
DefaultHash(size_t mNumBuckets = 101) throw(invalid_argument);
size_t hash(const T& key) const;
size_t numBuckets() const{return mNumBuckets;}
protected:
size_t mNumBuckets;
};
template<typename T>
DefaultHash<T>::DefaultHash(size_t numBuckets) throw(invalid_argument){
if (numBuckets<=0) {
throw invalid_argument("numBcukets must be > 0");
}
mNumBuckets = numBuckets;
}
template<typename T>
size_t DefaultHash<T>::hash(const T& key) const{
size_t bytes=sizeof(key);
size_t res=0;
for (size_t i=0; i<bytes; ++i) {
unsigned char b=*((unsigned char*)&key+i);
res+=b;
}
return res % mNumBuckets;
}
//模板特化为string类型
template<>
class DefaultHash<string>{
public:
DefaultHash(size_t numBuckets=101) throw(invalid_argument);
size_t hash(const string& key) const;
size_t numBuckets() const{return mNumBuckets;}
protected:
size_t mNumBuckets;
};
DefaultHash<string>::DefaultHash(size_t numBuckets) throw(invalid_argument)
{
if (numBuckets<=0) {
throw invalid_argument("numBcukets must be > 0");
}
mNumBuckets = numBuckets;
}
size_t DefaultHash<string>::hash(const string& key) const{
size_t sum=0;
for (size_t i=0; i< key.size(); ++i) {
sum += (unsigned char)key[i];
}
return sum % mNumBuckets;
}
//测试函数
void testDefaultHash(){
DefaultHash<int> myIntHash(500);
cout<<myIntHash.hash(100)<<" ";
DefaultHash<string> myStringHash(500);
cout<<"key=yht:"<< myStringHash.hash("yht")<<" "<<endl;
cout<<"mNumBuckets="<<myStringHash.numBuckets()<<endl ;
}
在main函数中调用testDefaultHash(),单独测试特化的模板类不报错,测试模板类时报下面错误:
Undefined symbols for architecture x86_64:
"DefaultHash<int>::DefaultHash(unsigned long)", referenced from:
testDefaultHash() in TestHeader.o
"DefaultHash<int>::hash(int const&) const", referenced from:
testDefaultHash() in TestHeader.o