英文:
Can't get pair from map value
问题
我有这个结构
static map<TypeA, pair<reference_wrapper<TypeB>, TypeC>> my_map;
后来,我像这样访问它:
pair<reference_wrapper<TypeB>, TypeC> instance = my_map[type_a_instance];
这个错误触发了:
没有匹配的函数调用 'std::pair<std::reference_wrapper<TypeB>, TypeC>::pair()'
英文:
I have this structure
static map<TypeA, pair<reference_wrapper<TypeB>, TypeC>> my_map;
Later, I access it like this:
pair<reference_wrapper<TypeB>, TypeC> instance = my_map[type_a_instance];
This error triggers:
> no matching function for call to 'std::pair<std::reference_wrapper< TypeB>, TypeC>::pair()'
答案1
得分: 7
map::operator[]
如果没有映射到键的默认构造映射对。由于reference_wrapper
的原因,这对于您的映射中的类型是不可能的。请改用find
。
pair<reference_wrapper<TypeB>, TypeC> instance =
my_map.find(type_a_instance)->second;
或者可以使用@Steve Lorimer建议的at
:
pair<reference_wrapper<TypeB>, TypeC> instance =
my_map.at(type_a_instance);
当然,这两个版本都假定可以找到键。find
版本在找不到键时会导致未定义行为,at
版本会引发std::out_of_range
异常。
英文:
map::operator[]
must default construct the pair in the map if no mapping for the key exists. That's not possible for the types in your map because of the reference_wrapper
. Use find
instead.
pair<reference_wrapper<TypeB>, TypeC> instance =
my_map.find(type_a_instance)->second;
Or use at
as suggested by @Steve Lorimer
pair<reference_wrapper<TypeB>, TypeC> instance =
my_map.at(type_a_instance);
Of course both versions assume that the key can be found. The find
version gives you undefined behaviour if the key is not found, the at
version gives a std::out_of_range
exception.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论