2012-12-15 50 views
2

我想在Bjarne的Stroustrup的(C++)的(翻譯成荷蘭語)書這個例子:爲什麼我得到這個調試斷言失敗?表達:列表迭代器不提領

#include <vector> 
#include <list> 
#include "complex.h" 

complex ac[200]; 
std::vector<complex> vc; 
std::list<complex> l; 

template<class In, class Out> void Copy(In from, In too_far, Out to) { 
    while(from != too_far) { 
      *to = *from; 
      ++to; 
      ++from; 
      } 
} 

void g(std::vector<complex>& vc , std::list<complex>& lc) { 
    Copy(&ac[0], &ac[200], lc.begin());   // generates debug error 
    Copy(lc.begin(), lc.end(), vc.begin());  // also generates debug error 
} 

void f() { 
    ac[0] = complex(10,20); 
    g(vc, l); 
} 

int main() { 
    f(); 
} 

**編譯和鏈接去成功(0錯誤/警告)* *

但在運行時我得到這個錯誤:

調試斷言失敗!

程序:exe文件路徑

文件:\ Program Files文件\ ms和工作室10.0 \ VC \包括\目錄

線:207

表達:列表迭代器不提領

有關程序如何導致斷言失敗的信息,請參閱關於斷言的Visual C++文檔。 (按重試調試應用程序)

+0

這是該網站的主題,屬於SO。請不要在這裏重新提出這個問題,因爲這可以被遷移。遵循的一條好規則是如果你的問題在你的IDE之前,它就屬於SO。如果它在白板前面,則屬於程序員。 – Walter

回答

1

以下錯誤的兩種:

Copy(&ac[0], &ac[200], lc.begin());   // generates debug error 
Copy(lc.begin(), lc.end(), vc.begin());  // also generates debug error 

Copy()函數覆蓋起始於作爲第三個參數供給的迭代器的元件。因此,目標範圍必須有效且足夠大以容納所有正在複製的元素。 lcvc都不能滿足這個要求,所以你的代碼的行爲是不確定的。

修復代碼的一種方法是使用std::back_inserter

+0

你是對的..我在我的代碼中發現錯誤,並且確實目標範圍不夠大。 (我認爲它自動擴展..)實際上它是空列表和空向量。我必須首先填寫列表 l和矢量 vc,首先使用200個空的複雜對象。之後,複製功能它工作得很好.. – Karel