2011-11-17 81 views
1

我想從Stroustrup的C++書中測試「checked迭代器」的例子。該代碼有一個運行時錯誤:「列表迭代器不兼容」。檢查迭代器

錯誤由函數「valid()」的「if(c->end() == p)」觸發。這個錯誤是什麼意思?我猜c->end()p都應該是list<int>::iterator

另外,我不明白爲什麼「運營商」是以這種方式實施的。順便說一句,我正在使用VS2008。

struct out_of_bounds{ 
    out_of_bounds() {} 
}; 

template<class Cont, class Iter = typename Cont::iterator> 
class Checked_iter : public iterator_traits<Iter> // deriving from iterator_traits 
{ 
    Iter curr; // iterator for current position 
    Cont* c; // pointer to current container 
    // ... 
public: 

    void valid(Iter p){ 
     if (c->end() == p) 
      return; 
     for (Iter pp = c->begin(); pp != c->end(); ++pp){ 
      if (pp == p) 
       return; 
     } 
     throw out_of_bounds(); 
    } 

    friend bool operator==(const Checked_iter& i, const Checked_iter& j){ 
     return i.c == j.c && i.curr == j.curr; 
    } 

    // no default initializer 
    // use default copy constructor and copy assignment 
    Checked_iter(Cont x, Iter p) : c(&x), curr(p) { valid(p); } 

    reference operator*(){ 
     if (curr == c->end()) throw out_of_bounds(); 
     return *curr; 
    } 

    pointer operator->(){ 
     return &*curr; // checked by * 
    } 

    Checked_iter operator+(difference_type d){ // for random-access iterator only 
     if (c->end() - curr <= d ) 
      throw out_of_bounds(); 
     return Checked_iter(c, curr+d); 
    } 

    reference operator[](difference_type d){ // for random-access iterator only 
     if (c->end() - curr <= d ) throw out_of_bounds(); 
     return c[d]; 
    } 

    Checked_iter& operator++(){ // prefix ++ 
     if (curr == c->end()) throw out_of_bounds(); 
     ++curr; 
     return *this; 
    } 

    Checked_iter& operator++(int) { // postfix ++ 
     Checked_iter temp = *this; 
     ++*this; // checked by prefix ++ 
     return temp; 
    } 

    Checked_iter& operator--() { // prefix -- 
     if (curr == c->begin()) throw out_of_bounds(); 
     --curr; 
     return *this; 
    } 

    Checked_iter& operator--(int) { // postfix -- 
     Checked_iter temp = *this; 
     --*this; // check by prefix 
     return temp; 
    } 

    difference_type index() { return curr-c.begin(); } // random-access only 
    Iter unchecked(){ return curr; } 
}; 

void f2(list<int>& ls){ 

    int count = 0; 
    try{ 
     Checked_iter< list<int> > p(ls, ls.begin()); 
     while(true){ 
      ++p; 
      ++count; 
      //cout << "element: " << *p << " count: " << count << endl; 
     } 
    } 
    catch(out_of_bounds){ 
     cout << "overrun after " << count << " tries \n"; 
    } 

} 

void test9(){ 
    int a[] = {0,1,2,3,4,5,6,7,8,9}; 
    list<int> l(a, a+sizeof(a)/sizeof(int)); 
    show(l); 
    f2(l); 
} 
+0

啊,好的,不知道我在想什麼。評論已刪除。 –

+0

代碼的變量名稱有點令人困惑。 f()中的p與valid()中的p不同。但我認爲這並不重要。 – ubbdd

回答

3

Checked_iter的構造函數應接受Cont &而不是Cont。您正在存儲一個指向臨時副本的指針。

+0

就是這樣。有用。非常感謝! – ubbdd