Unordered_map构造函数错误(equal_to模板化函数)
unordered_map constructor error (equal_to templated function)
我认为我可以有一个指针到一个完全专门化的模板函数,但下面的代码没有编译(MSVC2012)
#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
using namespace std;
unsigned long hashing_func(string key)
{
unsigned long hash = 0;
for(int i=0; i<key.size(); i++)
{
hash += (71*hash + key[i]) % 5;
}
return hash;
}
bool key_equal_fn2(string t1, string t2)
{
return t1 == t2;
}
template<class T> bool key_equal_fn(T t1, T t2)
{
return t1 == t2;
}
template <> bool key_equal_fn<string>(string t1, string t2)
{
return !(t1.compare(t2));
}
int main ()
{
unordered_map<string, string>::size_type n = 5;
unordered_map<string, string> mymap(n, (const std::hash<string> &)hashing_func, (const std::equal_to<string> &)(key_equal_fn<string>)) ;
mymap["paul"] = "jenna";
mymap["frank"] = "ashley";
return 0;
}
构造函数行返回以下错误:
错误C2440: 'type cast':无法从'bool (__cdecl *)(T,T)'转换to 'const std::equal_to<_Ty> &'
hashing_func
和key_equal_fn
都应该是函子对象(而不是函数)。此外,它们的类型必须提供给unordered_map
模板,即映射应该具有以下类型:
unordered_map<string, string, hashing_func, key_equal_fn>
其中hashing_func
和key_equal_fn
是函子类:
struct hashing_func {
unsigned long operator()(const string& key) const {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
}
};
struct key_equal_fn {
bool operator()(const string& t1, const string& t2) const {
return !(t1.compare(t2));
}
};
那么,mymap
定义如下:
typedef unordered_map<string, string, hashing_func, key_equal_fn> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func(), key_equal_fn());
或者,hashing_func
和/或key_equal_fn
可以是函数,但必须将它们包装成std::function
对象。也就是说,
unsigned long hashing_func(const string& key) {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
}
bool key_equal_fn(const string& t1, const string& t2){
return !(t1.compare(t2));
}
并以这种方式定义mymap
typedef unordered_map<string, string,
std::function<unsigned long(const string&)>,
std::function<bool(const string&, const string&)>> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func, key_equal_fn);
如果您愿意,可以使用lambdas,避免编写这两个函数或函子类:
typedef unordered_map<string, string,
std::function<unsigned long(const string&)>,
std::function<bool(const string&, const string&)>> MapType;
MapType mymap(n,
[](const string& key) -> unsigned long {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
},
[](const string& t1, const string& t2) {
return !(t1.compare(t2));
});
最后,我最喜欢的是all-lambda 解决方案
auto hashing_func = [](const string& key) -> unsigned long {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
};
auto key_equal_fn = [](const string& t1, const string& t2) {
return !(t1.compare(t2));
};
typedef unordered_map<string, string,
decltype(hashing_func), decltype(key_equal_fn)> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func, key_equal_fn);
相关文章:
- "error: no matching function for call to"构造函数错误
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- std::bind to a std::variant 包含多个 std::函数类型
- 如何修复 cpp 中的"undefined reference to"错误,当调用刚性车身树中的函数时,如 doKinematics、CreateKinematicCache
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 调用 to(列表和push_front)没有匹配函数
- MSVC:带函数的"error C2244: unable to match function definition to an existing declaration"是指专用模板类的类型别名
- 如果它被定义为 C++ 类中的成员函数,我得到了"non-standard syntax; use '&' to create a pointer to member"
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- C++'Undefined reference to'错误,尽管包含路径中的头文件中存在函数定义
- 尝试分配函数指针时获取"Void value not ignored as it ought to be"
- 调用布尔函数但收到错误"no matching function to call"?
- 为什么我"no matching function for call to .."可变参数模板函数?
- "attempting to reference a deleted function"函数参数
- 为什么我的复制构造函数出现"undefined reference to"错误?
- 传递variadic arg to模板函数时的汇编误差
- 将矩阵传递给函数。 "invalid conversion from 'int (*)[columns]' to 'int' [-fpermissive]"
- 将"pointer to pointer"传递给模板函数