2012-07-26 36 views
1

鉴于该代码在Visual Studio 2010:无法提领地图常量的mapped_type迭代

void Foo::Bar() const 
{ 
    map_t::const_iterator iter(my_map_.find(key)); 

    if(my_map_.end() != iter) 
     DoStuff(iter->second); 
} 

做的东西会值乘mapped_type。映射类型是可复制的,可移动的,可分配的类型。

我收到错误消息,指出在尝试访问第二个时无法复制键/值对。即使我写自己的台词:

iter->second; 
(*iter).second; 

,以确保它没有任何关系DoStuff ...

我相信迭代器使得键/值对的一个副本返回之前,操作符 - >或运营商*。

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

编辑:

地图本身是无符号的短裤的提高的变体,大致为这样:

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

你可以发表代码exibits *只*这个问题? – 2012-07-26 20:49:25

+0

如果'T = std :: map ',那么'T :: value_type'是'std :: pair '。注意常数。 – 2012-07-26 21:16:36

+0

正确,但我不想K,我想要V. – 2012-07-26 21:23:36

回答

0

我想通了。

WAYYYYY远离这段代码,并且深入一些抽象概念,映射的迭代器被传递给std :: partition!看起来,你不能划分地图。

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

我不知道为什么编译器变得如此困惑。问题代码完全不相关。但没关系。

0

编辑 答案无效;特定问题的更新如boost ::变种的结果(将与最终的答案更新一次的问题,其余信息可用)。

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

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

+0

我在原始文章中提到过,但也许我不清楚。我可以完全删除DoStuff行。如果主体只包含迭代器声明和“iter-> second;”,那么该行会给出错误消息。所以,分配给本地的mapped_type在这一点上是无关紧要的。我将编辑原始帖子以添加说明。 DoStuff是通过值,顺便说一句。 – 2012-07-26 21:06:38

+0

好吧,所以你没有提到你之前使用boost :: variant - 如果你使用varient的单个实例的地图,你有同样的错误吗?尝试使用“typedef long variant_t;”并查看错误是否持续。如果它消失了,我认为你的问题是迭代器不能取消引用变体类型,你可能需要通过StaticVisitor类来处理迭代器引用来处理各种情况(http://www.boost.org/)。 doc/libs/1_35_0/doc/html/variant/reference.html#variant.concepts.static-visitor) – Pyrce 2012-07-26 21:48:16