这个问题已在 SO 上被问过多次,但答案不适用于我的情况,AFAICT。以下代码在点击时立即触发错误i != std::end(observers_);
。
void VisualGeometry::SignalPopPointFlags(const Point_2r& p,
const uint32_t msec_delay) const {
for(auto i = std::begin(observers_); i != std::end(observers_); ++i)
(*i)->SlotPopPointFlags(p, msec_delay);
}
调查<vector>
,以下触发错误:
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pair
if (this->_Getcont() == 0
|| this->_Getcont() != _Right._Getcont())
{ // report error
_DEBUG_ERROR("vector iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
由于我没有比较来自不同容器的迭代器,因此似乎第一次检查this->_Getcont() == 0
可能是问题所在,但我不确定如何判断。
如果我将 begin(vec)/end(vec) 换成 vec.begin()/vec.end(),也会出现同样的问题。
我有点不知道这是怎么发生的。关于如何继续调试这个有什么建议吗?
VisualGeometry 类旨在将其接收到的信号转发给正在观看它的任何对象。以下是相关的代码片段:
class VisualGeometry : public IGeometryObserver, public IObservableGeometry {
public:
void SlotPushSegmentFlags(const Segment_2r& s, const uint32_t flags,
const uint32_t msec_delay = 0) override;
void SlotPopSegmentFlags(const Segment_2r& s,
const uint32_t msec_delay = 0) override;
void SignalPushSegmentFlags(const Segment_2r& s, const uint32_t flags,
const uint32_t msec_delay = 0) const override;
void SignalPopSegmentFlags(const Segment_2r& s,
const uint32_t msec_delay = 0) const override;
/* snip */
private:
std::vector<IGeometryObserver*> observers_;
};
void VisualGeometry::SlotPushSegmentFlags(const Segment_2r& s,
const uint32_t flags,
const uint32_t msec_delay) {
SignalPushSegmentFlags(s, flags, msec_delay);
}
void VisualGeometry::SlotPopPointFlags(const Point_2r& p,
const uint32_t msec_delay) {
SignalPopPointFlags(p, msec_delay);
}
/* etc... */