const char*的全特化
今天再写散列表时使用了模板,想要对C风格字符串进行模板全特化时却遇到了这个问题:
size_t Hash(const Type& key) const; // 声明
// 定义
template <>
size_t HashTblSP<const char*>::Hash(const const char*& key) const
{
size_t hashValue;
for (hashValue = 0; *key != '\0'; hashValue = (hashValue << 5) + *key++);
return hashValue % m_HashTable.size();
}
在声明中使用的是引用传递,于是我想着将形参写为const const char*&
类型,但编译器报出声明与定义不兼容,那便是形参错了。仔细想一想改为了const char* const&
,因为声明中传入的是常量左值引用,也就是内容不能更改的原实参,将模板特化为指针,那么声明中的const
便是修饰指针,也就是指针常量指针的指向不能改变。第一次遇到这种情况,来记录记录,果然const
这个关键字还是要好好注意啊。