【发布时间】:2012-07-26 20:47:36
【问题描述】:
鉴于 Visual Studio 2010 中的代码:
void Foo::Bar() const
{
map_t::const_iterator iter(my_map_.find(key));
if(my_map_.end() != iter)
DoStuff(iter->second);
}
Do stuff 将按值获取 mapped_type。映射类型是可复制、可移动、可分配的类型。
我在尝试访问第二个时收到无法复制键/值对的错误消息。即使我自己写:
iter->second;
(*iter).second;
确保它与 DoStuff 无关...
我假设迭代器在返回 operator-> 或 operator* 之前复制了键/值对。
如何获取映射类型的副本?
编辑:
地图本身是无符号短裤,以提升变体,大致如下:
typedef struct{} empty_t;
typedef boost::variant<empty_t, double, long, some POD types> variant_t;
typedef std::map<unsigned short, variant_t> map_t;
然后作为类的私有成员:
map_t my_map_;
需要明确的是,问题不在于传递给 DoStuff。我可以删除该行,然后简单地取消引用迭代器并访问第二个,这将导致编译器错误。
if(my_map_.end() != iter)
iter->second; //Doesn't do anything, but illustrates the error.
【问题讨论】:
-
你能发布只出现这个问题的代码吗?
-
如果
T = std::map<K, T>,那么T::value_type就是std::pair<const K, V>。注意常量。 -
正确,但我不要K,我要V。
-
您确定
variant_t类型仅包含POD 类型吗?我没有通过根据您的代码 sn-ps 拼凑我自己的示例并填写一些空白来重现这一点。我认为您可能需要按照 Luchian Grigore 的建议发布一个独立的复制示例。或者至少复制/粘贴相关的错误消息,这应该比“无法复制键/值对”提供更多详细信息。
标签: c++ visual-c++ stl map iterator