c++模板类中使用带模板的函数指针,该如何处理

c++模板类中使用带模板的函数指针
类的大体结构如下:
template<class Value_Type>
class HashTable
{
public:
  HashTable(bool (HashTable::*compare_ptr)(const Value_Type obj1, const Value_Type obj2), unsigned long size = 100) : isEqual(compare_ptr) {}

private:
bool (*isEqual)(const Value_Type obj1, const Value_Type obj2);
}

然后如下使用:
bool _compare(const char* val1, const char* val2)
{
if (strcmp(val1, val2) == 0)
return true;
else
return false;
}

int main()
{
HashTable< char* > hash(_compare);
}

结果编译器报错:
error C2664: “HashTable<Value_Type>::HashTable(bool (__thiscall HashTable<Value_Type>::* )(const Value_Type,const Value_Type),unsigned long)”: 不能将参数 1 从“bool (__cdecl *)(const char *,const char *)”转换为“bool (__thiscall HashTable<Value_Type>::* )(const Value_Type,const Value_Type)” g:\mycpp\hashtable\hashtable\demo.cpp 92

不知道该如何解决,请高手解答


------解决方案--------------------
Value_Type 前面的const是不考虑的,普通函数的时候才会考虑前面的const,这一句说错了,
Value_Type 被char *所取代,而const所修饰的并不是const char * obj1,const修饰的是obj1指针,不是指针所指向的对象,即:char * const obj1,所以函数的参数类型不匹配。

比如:typedef char * A;而A就是定义字符指针的类型,如A b;b就是一个字符指针,但这样定义:
const A b;那么const是修饰的指针b呢还是修饰的b所指向的对象呢,答案是修饰的指针b本身,不是b所指向的对象,const A b;等价于:char * const b;

因此,对于HashTable<char*> hash(_compare);这一句,char * 取代了Value_Type,而构造函数中的函数指针参数const Value_Type obj1,这一句等价于:char * const obj1;

传递过来的实参是:bool _compare(const char* val1, const char* val2),该函数的参数是
const char * 类型,因此类型不匹配