none
c++模板类中使用带模板参数的函数指针 RRS feed

  • 问题

  • 类的大体结构如下:

    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:33

答案

  • 漫步者你好!

    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 Zhao


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Helen Zhao 2012年3月23日 5:43
    2012年3月19日 6:02

全部回复

  • Value_Type 这个未定义

    0xBAADF00D

    2012年3月18日 15:06
    版主
  • 漫步者你好!

    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 Zhao


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Helen Zhao 2012年3月23日 5:43
    2012年3月19日 6:02
  • 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

    2012年11月12日 1:57