积极答复者
c++模板类中使用带模板参数的函数指针

问题
-
类的大体结构如下:
template<class Value_Type> class HashTable { public: HashTable(bool (*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); }
结果编译器报错:
错误 1 error C2664: “HashTable<Value_Type>::HashTable(bool (__cdecl *)(const Value_Type,const Value_Type),unsigned long)”: 不能将参数 1 从“bool (__cdecl *)(const char *,const char *)”转换为“bool (__cdecl *)(const Value_Type,const Value_Type)” g:\mycpp\hashtable\hashtable\demo.cpp 92不知道该如何解决,请高手解答
- 已编辑 漫步者 2012年3月17日 8:44
答案
-
漫步者你好!
HashTable的构造函数有两个参数,第一个是函数指针,第二个是unsigned long类型数据。在main函数中的初始化中只传递一个参数。这是不对的。另外。HashTable的函数指针,其参数都是const Value_type类型的。而_compare的参数是const char*。即使Value_type是char*,这样也是不对的。
下面的代码可以无错误的运行,请参考:
template<class Value_type> class HashTable { public: HashTable(bool (*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 _tmain(int argc, _TCHAR* argv[]) { unsigned long size=0; HashTable< char > hash(&_compare, size); return 0; }
祝你好运!
Helen ZhaoHelen Zhao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Helen Zhao 2012年3月23日 5:43
全部回复
-
漫步者你好!
HashTable的构造函数有两个参数,第一个是函数指针,第二个是unsigned long类型数据。在main函数中的初始化中只传递一个参数。这是不对的。另外。HashTable的函数指针,其参数都是const Value_type类型的。而_compare的参数是const char*。即使Value_type是char*,这样也是不对的。
下面的代码可以无错误的运行,请参考:
template<class Value_type> class HashTable { public: HashTable(bool (*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 _tmain(int argc, _TCHAR* argv[]) { unsigned long size=0; HashTable< char > hash(&_compare, size); return 0; }
祝你好运!
Helen ZhaoHelen Zhao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Helen Zhao 2012年3月23日 5:43
-
Helen Zhao 你好!
你的回答非常棒,对我的启发很大,谢谢!但不足的是:你所说的第一个问题是不存在的,因为HashTable构造函数中第二个参数size有默认值,故在main函数中只传递一个参数是正确的。
HashTable(bool (*compare_ptr)(const Value_type* obj1, const Value_type* obj2),
unsigned long size = 100) : isEqual(compare_ptr) {}
故可以如下调用:
HashTable< char > hash(&_compare);
shutear
shutear