2013-04-04 44 views
10

Điều này thật lạ .. mã sau (mà tôi đã biên dịch nhờ Cassio Neri) được biên dịch mà không có bất kỳ lỗi nào .. bằng cách hashing_func hoặc key_equal_func được gọi (các cửa sổ không hiển thị trong cửa sổ bảng điều khiển)unordered_map với hàm băm/chức năng bằng nhau tùy chỉnh - không được gọi là

#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; 
} 

Tôi đang sử dụng MSVC2012, bất kỳ gợi ý nào về vấn đề này có thể là gì?

+2

Bạn vẫn đang phạm những sai lầm tương tự như trong câu hỏi khác. Hãy xem các giải pháp của tôi. http://stackoverflow.com/questions/15809087/unordered-map-constructor-error-equal-to-templated-function –

Trả lời

7

Vấn đề là bạn cần phải chuyển các loại hàm băm của bạn và hàm hash_key_equal thành unordered_map của bạn, và sau đó là các hàm thực tế cho ctor của bản đồ.

nét unordered_map của bạn sẽ trông như thế này:

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>); 

Các unordered_map là một mẫu và nó trông như thế này:

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; 

có nghĩa là nếu bạn muốn vượt qua mới HashKeyEqual chức năng bạn phải nói cho mẫu các loại của những thứ này.

Link là không thể truy cập được nữa (Request Cập nhật): Live Example

+1

OK: chức năng templated có các tham số mặc định .. các hàm có thể suy ra các tham số templated từ các đối số của chúng, nhưng nếu tôi không chỉ định chúng tôi có thể sử dụng những cái mặc định và nhận được lỗi. Cảm ơn bạn Tony !! Đây không phải là một nắm bắt dễ dàng trong quan điểm của tôi !! – Paul

+0

Ý nghĩa của tham số 'n' là gì? Kích thước của bảng băm? –

13

Bạn cần phải xác định băm/so sánh chức năng với các đối số mẫu, không phải trong constructor. Dưới đây là ví dụ:

class Hasher 
{ 
public: 
    size_t operator() (string const& key) const 
    { 
     cout << "Hashing called"; 
     size_t hash = 0; 
     for(size_t i=0; i<key.size(); i++) 
     { 
      hash += (71*hash + key[i]) % 5; 
     } 
     return hash; 
    } 
}; 
class EqualFn 
{ 
public: 
    bool operator() (string const& t1, string const& t2) const 
    { 
    cout << "Equal called"; 
    return !(t1.compare(t2)); 
    } 
}; 

unordered_map<string, string, Hasher, EqualFn> mymap(5); 
Các vấn đề liên quan