无法取消引用map const迭代器的mapped_type

时间:2012-07-26 20:47:36

标签: c++ visual-c++ stl map iterator

鉴于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->之前正在复制键/值对。或运营商*。

如何获取映射类型的副本?

编辑:

地图本身是无符号短裤以提升变体,大致如此:

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.

2 个答案:

答案 0 :(得分:0)

修改 作为boost :: variant的结果,回答无效的给定问题更新(一旦剩下的问题信息可用,将更新最终答案)。

如果DoStuff通过引用或值获取变量,并且您直接从const_iterator传递变量,则DoStuff必须具有const引用或const值重载函数调用(除非对象类型具有非const的默认const)转换可用)。否则编译器会抱怨因为你将const元素视为非const。

另一个选择是将iter-&gt; second分配给另一个变量(通过构造函数或赋值,具体取决于元素类型)并将其传递给DoStuff - 但最好定义函数的const重载版本。

答案 1 :(得分:0)

我明白了。

WAYYYYY远离这段代码,并且有几个抽象深度,地图的迭代器被传递给std :: partition!看来,你无法对地图进行分区。

我将地图的内容复制到本地矢量中并从那里继续处理,并清除了所有错误消息。

我不知道为什么编译器会如此混乱。问题代码完全不相关。但这没关系。