1

鉴于 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.
4

2 回答 2

0

编辑 由于 boost::variant 导致给定问题更新的答案无效(一旦其余问题信息可用,将使用最终答案更新)。

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

另一种选择是将 iter->second 分配给另一个变量(根据元素类型通过构造函数或赋值)并将其传递给 DoStuff ——但最好定义函数的 const 重载版本。

于 2012-07-26T20:53:17.863 回答
0

我想到了。

远离这段代码的 WAYYYYYY,以及一些深入的抽象,映射的迭代器被传递给 std::partition!您似乎无法对地图进行分区。

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

我不知道为什么编译器会变得如此混乱。问题代码在某个完全不相关的地方。但这没关系。

于 2012-08-07T21:06:49.097 回答