4

この質問は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... */
4

1 に答える 1