2016-11-18 49 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

相关问题