我遇到了一些问题,可以通过以下代码恢复:
template <typename Key, typename Data, typename fct>
size_t wrapper(const std::pair<Key, Data> & p)
{
return fct(p.first);
}
int main(int argc, char *argv[])
{
size_t val =
wrapper<int, int, dft_hash_fct<int>>(std::pair<int,int>(5,9));
return 0;
}
我正在使用 clang 编译器 3.4 版,此代码无法编译并出现以下错误
test-tmp.C:17:5: error: no matching function for call to 'wrapper'
wrapper<int, int, dft_hash_fct<int>>(std::pair<int,int>(5,9));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test-tmp.C:9:8: note: candidate template ignored: invalid explicitly-specified argument
for template parameter 'fct'
这个想法是包装一个散列函数(模板参数fct
)std::pair
只取第一个字段。
dft_hash_fct
是另一个模板定义如下:
template <typename Key>
size_t dft_hash_fct(const Key & key)
{
return SuperFastHash(key);
}
这个通用函数有效;它已在其他情况下使用。
所有这些的目的是重用基于散列的集合(而不是映射)作为任何类型项目的键映射。基于散列的 ser 在构建时接收散列函数。
感谢您的评论(大卫、安德烈和卡扎克)
编辑:
好吧,我明白了,typename fct 是一个类型,所以我不能作为指针函数处理;对不起琐事。不幸的是,我认为在包装器中将函数作为参数传递的方法不起作用,因为哈希集需要一个具有以下签名的函数指针:
size_t (*the_function)(const Key & key);
因此,由于您的观察,意识到这一点,我将相关代码更改为:
template <typename Key, typename Data, size_t (*fct)(const Key & k)>
size_t wrapper(const std::pair<Key, Data> & p)
{
return (*fct)(p.first);
}
int main(int argc, char *argv[])
{
size_t val =
wrapper<int, int, dft_hash_fct<int>>(std::pair<int,int>(5,9));
return 0;
}
编译,链接和运行。另外,我把这一行:
size_t (*fct)(const std::pair<int, int>&) =
wrapper<int, int, dft_hash_fct<int>>;
cout << (*fct)(std::pair<int, int>(4,6)) << endl;
并且编译,链接 ans 也运行。所以,我可以说编译器(当然根据语言)可以实例化函数并处理指向它的函数指针。
所以,在那之后我尝试修改我的原始代码,这是一个 HashSet 的派生类,用于管理由第一个字段散列的对。
我声明一些为:
template <typename Key, typename Data>
class HashMap : public HashSet<std::pair<Key, Data>>
{
...
HashMap(size_t (*function)(const Key & key))
: HashSet<Key, Data>(wrapper<Key, Data, function>)
{
}
..
};
但是编译(使用 std=c++11)失败并出现错误
./tpl_dynSetHash.H:353:7: error: no matching constructor for initialization of
'HashSet<std::pair<unsigned long, long>>'
: HashSet<std::pair<Key,Data>(
^
testDynSetHash.C:178:8: note: in instantiation of member function
'HashMap<unsigned long, long>::HashMap' requested here
HMap table;
但是,如果我将调用替换为基础构造函数
: HashSet<Key, Data>(wrapper<Key, Data, dft_hash_fct<Key>)
这编译得很好。因此,我认为问题出在参数类型声明上(但我不知道是什么)。