这是我的一小段代码让我的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
是我定义的类是有意义的,它基本上是{{列表的容器1}}加上一些额外的棒极了。我认为这个问题很少,特别是因为会员是公开的,我直接处理它们,所以你可以在这个片段中有效地看到我所有的脏衣服。
麻烦的是,我随机得到一个“map / set iterator not incrementable”异常,特别是当我有点疯狂并绘制一条很长的痕迹时(但是有时会出现较短痕迹的粪便,这就是随机事物的问题) )。另外,只有当我从桌面上抬起手指(你明白了)我才能在这里执行这段漂亮的小代码时才会发生这种情况:
tuio::Cursor
注意评论,如果你需要用硬棒打我,如果问题结果是这个主线程和绘图线程之间的一些奇怪的交叉运行。在这一点上,让你知道我正在使用libCinder可能很重要或者不重要,虽然我对它的内部结构知之甚少所以我只能推测应用程序和绘图在不同的线程中运行。反正。
回溯标识第一行上的void TheApp::cursorRemoved(tuio::Cursor cursor) {
_traces[cursor.getSessionId()].addCursorUp(cursor);
_traces.erase(cursor.getSessionId());
// Well, that was abrupt.
}
,当然for
引发异常,我怀疑我应该知道什么,Jon Snow。 std::_Tree_const_iterator<something>
似乎工作正常,或者至少是VS告诉我的,所以我认为auto
构造出了问题,并用显式迭代器等重写了它。
我有多错。接下来,我将auto更改为显式类型,但没有什么比这更好了。好吧,不是真的,因为在某些时候我得到了一个不同的异常,一些关于列表迭代器不兼容的东西,这就是为什么我把汽车扔掉并硬编码实际类型。
虽然此时我正在有效地使用普通的旧C ++ 03技术,但其余的代码仍然被VS 2012编译为C ++ 11,在处理切割时,这并不完全可靠。边缘技术(事实上,我最后一次检查,这是六个多月前,它甚至不支持基于范围的for循环)。
任何想法都赞赏。
答案 0 :(得分:3)
如果在循环_traces
中擦除光标for(auto trace : _traces) {
,则循环迭代器将失效