map / set iterators不兼容[c ++]

时间:2015-07-09 21:17:35

标签: c++ dictionary iterator std

我试图遍历地图,如下所示:

data = &server->update();

    for (auto const iter : *data)
    {
        do things
    }

但是只要for line运行,我就会收到错误声明" map / set iterators不兼容"。

数据变量是

std::map<unsigned int, Packet> *data;

它是一个指针,因为它位于:

public ref class ServerForm : public System::Windows::Forms::Form

这似乎不喜欢任何不是指针的东西。

我尝试了多种迭代这个地图的方法,每次尝试都完全失败了。我非常感谢能够解释为什么会发生这种情况以及如何解决它,谢谢。

1 个答案:

答案 0 :(得分:0)

data = &server->update();
// same as
data = &(server->update());

由于update函数按值返回,因此将指针绑定到具有自动存储持续时间的实例,其生命周期以此行结束(&#34;临时&#34;)。

事实上,后来在你的循环中

for(auto const it : *data)

您正在取消引用无效指针,这会产生未定义的行为。

令我惊讶的是代码甚至是编译。我无法获得像这样的测试用例在ideone / GCC中工作。

要使用更新功能返回的临时值,您有以下几种可能:

  1. 将地图存储在本地变量中。
  2. 通过将临时绑定到引用来延长临时的生命周期:

    auto & map = server->update ();
    

    这不起作用&#34;向上&#34;在调用堆栈中,因此您无法返回该引用。

  3. 将循环带入限制临时生命周期的完整表达式:

    for (auto const it : server->update()) {
      // ....