0

这是我宝贵的一小段代码,它让我的 VC++ 2012 不寒而栗,而如果我在 Mac 上运行相同的代码,似乎完全没有问题。

for(auto trace : _traces) {
    std::list<tuio::Cursor> cursors = trace.second.cursors;

    std::vector<Vec2f> v;
    for(tuio::Cursor p : cursors) {
        v.push_back(p.getPos());
    }
    if(v.size() > 2) {
        BSpline2f l(v, min((int)v.size()-1, 3), false, true);
        PolyLine2f pl;
        for(int i = 0; i < v.size(); i++) {
            float t = (float)i/(float)v.size();
            pl.push_back((l.getPosition(t)*s)+o);
        }
        gl::draw(pl);
    }


    tuio::Cursor c = cursors.back();
    gl::drawSolidCircle((c.getPos()*s)+o , _scale * 10.0f);
}

在这一点上,让您知道这_traces是一个std::map<int, TouchTrace>并且TouchTrace是我定义的一个类是有意义的,它基本上是一个容器,其中包含一个列表tuio::Cursor以及一些额外的令人敬畏的东西。我认为这个问题无关紧要,特别是因为成员是公开的,我直接与他们打交道,所以你可以在这个片段中有效地看到我所有的脏衣服。

问题是我随机得到一个“map/set iterator not incrementable”异常,尤其是当我有点疯狂并画了一条很长的轨迹时(但粪便有时会发生在较短的轨迹上,这就是随机事物的问题)。另外,只有当我将手指从桌面上抬起时才会发生这种情况(你明白了),我在这里执行这段漂亮的小代码:

void TheApp::cursorRemoved(tuio::Cursor cursor) {
    _traces[cursor.getSessionId()].addCursorUp(cursor);
    _traces.erase(cursor.getSessionId());
    // Well, that was abrupt.
}

请注意注释,以防万一你需要用硬棍子打我,如果问题是这个主线程和绘图线程之间的某种奇怪的交叉运行。在这一点上,让您知道我正在使用 libCinder 可能很重要,尽管我对它的内部知之甚少,所以我只能推测应用程序和绘图在不同的线程中运行。无论如何。

回溯在第一行确定了这一点for,当然异常是由 引发的std::_Tree_const_iterator<something>,我怀疑我应该对此一无所知,Jon Snow。thingieauto似乎工作正常,或者至少这是 VS 告诉我的,所以我认为foreach构造有问题并用显式迭代器等重写​​了它。

我错了。接下来,我将 auto 更改为它们的显式类型,但没有任何改进。好吧,不是真的,因为在某些时候我遇到了一个不同的异常,关于列表迭代器不兼容的问题,这就是为什么我把汽车扔掉并硬编码实际类型的原因。

尽管此时我有效地使用了普通的旧 C++03 技术,但其余代码仍被 VS 2012 编译为 C++11,这在处理尖端技术时并不完全可靠(事实上,我上次检查时,也就是六个月前,它甚至不支持基于范围的 for 循环)。

任何想法表示赞赏。

4

1 回答 1

3

如果_traces在循环中擦除光标for(auto trace : _traces) {,循环迭代器将失效

于 2013-06-20T14:56:27.283 回答