2016-11-18 84 views
-6

我有一個結構爲什麼unordered_map說沒有匹配的構造函數進行初始化?

struct Key { 
    double x; 
    double y; 
    double z; 

    bool operator==(const Key& k) const{ 
     return (x == k.x && y == k.y && z == k.z); 
    } 
} 

我這樣做是因爲我想使這個作爲哈希映射鍵。

然後我做

std::unordered_map<Key, int> map = {{1.01, 2.02, 3.03}, 333}; 

,我想使用初始化列表作爲構造,但我得到的錯誤no matching constructor for initialization of 'std::unordered_map<key, int> map = {{1.01, 2.02, 3.03}, 333};'

+0

你如何期待系統建立一個無序的地圖,當它所能做的只是比較關鍵字是否相等?它基於什麼來映射? –

+0

我不知道你有什麼樣的編譯器,但'gcc'輸出一個非常容易理解的消息['錯誤:不匹配'(const std :: hash )(const Key&)''](http: //ideone.com/7gm9Tk)。 –

+2

請提供[mcve]。這不是一個。 – Barry

回答

5

嘗試的{{{1.01, 2.02, 3.03}, 333}}代替{{1.01, 2.02, 3.03}, 333}

容器可以用元素的列表進行初始化,而不是指導如何構建一個元素。

+2

密鑰不可散列。我想這就是原因。 –

+2

@EdgarRokyan我沒有看到證據證明密鑰不可散列。一個'std :: hash'特化可能存在於其他地方;如果沒有,它不可排除不會觸發該編譯器錯誤。 – Yakk

+2

@Yakk是的額外的花括號解決了問題。 – pokche

3

這裏有很多問題。

首先,您尚未爲Key類型定義散列函數。要使用Key作爲unordered_map中的關鍵字,您需要一個相等運算符(您已經完成)和std::hash的專業化,您還沒有完成這項工作。所以你需要做這樣的事情:

namespace std { 
    template <> struct hash<Key> { 
     unsigned operator()(const Key& arg) const { 
      return /* some hash code */ 
     }  
    }; 
} 

其次,你的初始化列表中的大括號級別太少。預計初始化列表是鍵/值對的列表,所以如果你想使用一個單一的鍵值對作爲初始地圖內容,你需要額外的括號:

std::unordered_map<Key, int> map = {{{1.01, 2.02, 3.03}, 333}}; 

這將編譯這些變化;請參閱this demo進行確認。

+0

我們不知道是否存在散列函數。提供的唯一錯誤消息並不表示散列函子不存在。你也缺少一套大括號。 – NathanOliver

+0

是否有任何理由使用'namespace std'而不是'std :: hash'? – pokche

+0

@NathanOliver哦,很好的支撐 - 我將它們從原始複製粘貼並忘記編輯。你說得對 - 我們不知道這是肯定的,但鑑於OP包括了整個班級的定義,我懷疑他們可能沒有包括它。 – templatetypedef

相關問題