我对新的C ++ unordered_map有问题:我想将operator[]
与const
密钥一起使用,但我被拒绝了。
我无法提供整个代码,但我可以像这样简化我的问题:
#include <unordered_map>
class A {
public:
A();
};
class B {
public:
B();
};
int main(int argc, char **argv) {
std::unordered_map<A &, B> myMap;
A a;
const A &ar = a;
B b;
myMap[ar] = b;
}
编译器的输出有点长,但以:
结束/usr/include/c++/4.6/bits/hashtable_policy.h:537:5: note: no known conversion for argument 1 from ‘const A’ to ‘A&’
我使用const A &
,因为在我的代码中,某些方法按原样提供给我。顺便说一句,密钥应该是const。我尝试了std::unordered_map<const A &, B> myMap;
,但它也不起作用。
我使用gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5),-std=c++0x
标志。
非常感谢(如果问题很愚蠢,请原谅......)。
答案 0 :(得分:4)
原因是operator[]
指定如下(注意同样适用于std::map
):
Value& operator[](Key const& k);
在您的情况下,Key
为A&
,因此扩展为:
B& operator[](A& const& k);
由于引用引用无效,并且在通过typedef或模板参数创建时删除了顶级引用,因此您只需:
B& operator[](A&);
无法处理A const&
参数。
一般来说,我建议不要使用可变引用作为密钥,因为可变密钥是错误的良好来源。
答案 1 :(得分:0)
使用引用作为键是一个坏主意:它必然会导致问题,因为地图的生命周期和键未对齐。您的引用地图的关键类型是T&
(嗯,最后添加了const
但它是非法的)。尝试将T const&
绑定到T&
不起作用。因此,您无法使用T const&
使用T&
作为关键字在地图中查找。
还有其他一些不起作用的东西。您不应该尝试使用密钥为T&
(或T*
的地图):使用值作为键!