2014-02-18 49 views
0

我正在製作一個無序的地圖: 其關鍵字由三個字符組成 ,值爲整數。Unorderedmap:模板參數出錯

下面是代碼:

namespace G { 

typedef std::tuple< char, char, char> key_t; 

struct key_hash : public std::unary_function<key_t, std::size_t> 
{ 
std::size_t operator()(const key_t& k) const 
{ 
return std::get<0>(k)^std::get<1>(k)^std::get<2>(k); 
} 
}; 

struct key_equal : public std::binary_function<key_t, key_t, key_t, bool> 
{ 
bool operator()(const key_t& v0, const key_t& v1, const key_t& v2) const 
{ 
return (
std::get<0>(v0) == std::get<0>(v1) && 
std::get<1>(v0) == std::get<1>(v1) && 
std::get<2>(v0) == std::get<2>(v1) 

); 
} 
}; 

struct IndexGuide 
{ 
int index; 

}; 

typedef std::unordered_map<const key_t,IndexGuide,key_hash,key_equal> GuideDouble; 
} 

但是當我編譯代碼,我得到這個錯誤

In file included from StateTableGenerator.cpp:3:0: 
StateTables.h:72:75: error: wrong number of template arguments (5, should be 3) 
/usr/include/c++/4.6/bits/stl_function.h:115:12: error: provided for ‘template<class _Arg1, class _Arg2, class _Result> struct std::binary_function’ 

普萊舍幫助我什麼,我做錯了什麼?

+3

你甚至讀過錯誤嗎?它表示你爲'std :: binary_function'傳遞了錯誤的模板參數。並猜測你*是什麼。* – Angew

+0

注意:你的散列可以改進。在大多數體系結構中,'sizeof(size_t)> 3',這意味着簡單地移動或字符將爲每個密鑰提供一個唯一的散列值,使散列函數完美(無衝突)。而你並不真的需要'key_equal','std :: tuple'提供'operator ==',它完全符合你的期望。 – Angew

+0

如果這就是它的全部,那麼你也不需要'key_hash'(至少不會被寫入)。沒有什麼能夠阻止你從專門化'std :: hash '並讓標準lib從那裏取得它。 – WhozCraig

回答

3

我猜你的問題是與你的key_equal,你在哪裏製作一個二進制函數帶三個參數。二元函數是一個帶有兩個參數的函數。