2016-01-17 58 views
1

我正在處理一個程序,該程序應該將每個窗口放入列表中,調整其大小,並根據指定的佈局將其移動到屏幕位置。調試斷言錯誤 - 列表迭代器不兼容

當我運行這個函數但是我得到一個調試斷言錯誤說「列表迭代器不兼容」。

下面是代碼:

void Control::checkForNewWindows() 
{ 
    for (std::list<Window>::iterator i = mainDetector.getWindowList().begin(); i != mainDetector.getWindowList().end(); ++i) 
    { 
     bool forBreak = false; 
     if ((i->getTitle().find("sample_title") != std::string::npos) && (i->getState() == false)) 
     { 
      for (int y = 0; y < 3; y++) 
      { 
       for (int x = 0; x < 4; x++) 
       { 
        if (activeLayout.windowLayout[y][x].getHandle() == 0) 
        { 
         moveWindow(*i, activeLayout.dimensionsLayout[y][x].x, activeLayout.dimensionsLayout[y][x].y, activeLayout.dimensionsLayout[y][x].width, 
          activeLayout.dimensionsLayout[y][x].height); 
         activeLayout.windowLayout[y][x] = *i; 
         activeLayout.windowLayout[y][x].setState(true); 
         forBreak = true; 
        } 
        if (forBreak) 
        { 
         break; 
        } 
       } 
       if (forBreak) 
       { 
        break; 
       } 
      } 
     } 
    } 
} 

在第一個for循環出現的錯誤,希望有人能幫助我解決這個

編輯:

這裏是getWindowList功能:

std::list <Window> Detector::getWindowList() 
{ 
    return windowList; 
} 

和windowList定義:

std::list <Window> windowList; 
+0

'getWindowList()'請發佈此功能。這個函數的返回值類型可能是原因。 – PaulMcKenzie

+0

使用調試器查找此代碼的哪一行是斷言的原因,這將有很大幫助。 –

+1

這裏是我的意思在我的意見:請在這個答案中替換'std :: vector'與'std :: list':http://stackoverflow.com/questions/30041907/can-i-use-nested-loops -with-vectors-in-cpp/30042185#30042185 - 這有幫助嗎? – PaulMcKenzie

回答

0

你的循環如下所示:

for (std::list<Window>::iterator i = mainDetector.getWindowList().begin(); 
    i != mainDetector.getWindowList().end(); 
    ++i) 

鑑於上述情況,這個問題是這樣的:

std::list <Window> Detector::getWindowList() 
{ 
    return windowList; 
} 

你返回列表的副本,而不是原件。因此,複製的迭代器將在循環中使用,而不是windowList的迭代器。事實上,你在循環結構中使用了兩個不同的迭代器,它們都沒有引用原始列表,只有副本。

修復的方法是返回一個參考:

std::list <Window>& Detector::getWindowList() 
{ 
    return windowList; 
} 

你現在返回到實際的列表,而不是一個副本的引用。現在你在循環約束中使用的迭代器引用相同的列表,而不是不同的列表。