如何在具有多个参数类型的模板类中只专门化一个方法 我在C++中实现了 HaseTabe/Cuff>模板类,其原型如下: template<class K, class T, unsigned int containerSize=CONTAINER_SIZE> class LPHashTableChained{ ........ unsigned int hashFunction(K& key); }

如何在具有多个参数类型的模板类中只专门化一个方法 我在C++中实现了 HaseTabe/Cuff>模板类,其原型如下: template<class K, class T, unsigned int containerSize=CONTAINER_SIZE> class LPHashTableChained{ ........ unsigned int hashFunction(K& key); },c++,class,templates,C++,Class,Templates,第二次实施: 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,

第二次实施:

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){

}
模板
unsigned int LPHashTableChained::hashFunction(常量字符串和键){
}
但是我有编译错误

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


谢谢

您不能部分专门化模板的成员函数。(不过,总的专业化是可以的。)

但是,对于您的类来说,最好的方法是像标准库一样,提供哈希函数作为“策略”类型的模板参数:

template <typename K, typename V, typename Hash = std::hash<K>>
class HashTable
{
  Hash hasher;
  // use hasher(x)
};
模板
类哈希表
{
散列哈希器;
//使用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;
//提供自定义
结构MyInShare{std::size_t operator()(const Foo&)const;};
哈希表m1;
//为“std::hash”添加专门化:
名称空间标准
{
模板结构哈希{size_t operator()(const Bar&)const;};
}
哈希表m2;

不能部分专门化模板的成员函数。(不过,总的专业化是可以的。)

但是,对于您的类来说,最好的方法是像标准库一样,提供哈希函数作为“策略”类型的模板参数:

template <typename K, typename V, typename Hash = std::hash<K>>
class HashTable
{
  Hash hasher;
  // use hasher(x)
};
模板
类哈希表
{
散列哈希器;
//使用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;
//提供自定义
结构MyInShare{std::size_t operator()(const Foo&)const;};
哈希表m1;
//为“std::hash”添加专门化:
名称空间标准
{
模板结构哈希{size_t operator()(const Bar&)const;};
}
哈希表m2;

函数不允许部分专业化,只有类/结构允许。函数不允许部分专业化,只有类/结构允许。您的意思是按如下方式更改类声明:模板类LPHashTableChained{…};你说的专门化散列程序是指什么?我以前从来没有用过这个。@LambrosPetrou:是的,类似的东西。哈希器呢???我怎么能让它超载??它已经在标准库中了吗?我只需要重载字符串类型?很抱歉,我找不到只为一种类型专门化哈希程序的方法。如果你能写一个只返回0的小例子,看看我如何实现它,我将不胜感激。好的,完成。我认为你应该仔细研究一下
std::unordered_map
的界面,花几个小时来看看你的方法的专家解决方案;这会给你一些好主意。你的意思是改变类声明如下:模板类LPHashTableChained{….};你说的专门化散列程序是指什么?我以前从来没有用过这个。@LambrosPetrou:是的,类似的东西。哈希器呢???我怎么能让它超载??它已经在标准库中了吗?我只需要重载字符串类型?很抱歉,我找不到只为一种类型专门化哈希程序的方法。如果你能写一个只返回0的小例子,看看我如何实现它,我将不胜感激。好的,完成。我认为你应该仔细研究一下
std::unordered_map
的界面,花几个小时来看看你的方法的专家解决方案;那会给你一些好主意。