这个问题在这里已经有一个答案:>
unordered_map constructor error (equal_to templated function)1
这是奇怪的..以下代码(我设法编译感谢 Cassio Neri)正在编译没有任何错误..通过hashing_func和key_equal_func被调用的方式(在控制台窗口中没有显示粗体)
这是奇怪的..以下代码(我设法编译感谢 Cassio Neri)正在编译没有任何错误..通过hashing_func和key_equal_func被调用的方式(在控制台窗口中没有显示粗体)
#include <iostream> #include <string> #include <unordered_map> #include <algorithm> #include <functional> using namespace std; unsigned long hashing_func(string key) { cout << "Hashing called"; unsigned long hash = 0; for(int i=0; i<key.size(); i++) { hash += (71*hash + key[i]) % 5; } return hash; } template<class T> bool key_equal_fn(T t1,T t2) { return t1 == t2; } template <> bool key_equal_fn<string>(string t1,string t2) { cout << "Equal called"; 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> &)(function<bool(string,string)>(key_equal_fn<string>))) ; bool case_insensitive = mymap.key_eq()("test","TEST"); mymap["paul"] = "jenna"; mymap["frank"] = "ashley"; if(mymap["paul"] == mymap["frank"]) cout << "equal" << endl; return 0; }
我正在使用MSVC2012,任何提示可能是什么问题?
@H_404_7@解决方法
问题是您需要将hash函数和hash_key_equal函数的类型传递给unordered_map,然后将实际函数传递给映射的ctor.
您的unordered_map定义应如下所示:
unordered_map< std::string,std::string,std::function<unsigned long(std::string)>,std::function<bool(std::string,std::string)> > mymap(n,hashing_func,key_equal_fn<std::string>);
unordered_map是一个模板,它看起来像这样:
template< class Key,class T,class Hash = std::hash<Key>,class KeyEqual = std::equal_to<Key>,class Allocator = std::allocator<std::pair<const Key,T>> > class unordered_map;
这意味着如果你想传递新的Hash和KeyEqual函数,你必须告诉模板这些东西的类型.
链接不能访问(请求更新):
Live Example