这是我宝贵的一小段代码,它让我的 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 循环)。
任何想法表示赞赏。