这是我在main.cpp中的代码
std::list<AbstractBlock*>::iterator i;
for (i = universe.getLoadedBlocks().begin(); i != universe.getLoadedBlocks().end(); i++){
window.draw((*i)->draw());
}
Universe.cpp:
std::list<AbstractBlock*> Universe::getLoadedBlocks(){
return chunkManager->getLoadedBlocks();
}
CunkManager.cpp:
std::list<AbstractBlock*> ChunkManager::getLoadedBlocks(){
return loadedBlocks;
}
且loadedBlocks是std::list<AbstractBlock*>
我正在尝试使用列表并第一次尝试使用它们...我不确定为什么我会收到此错误
答案 0 :(得分:6)
std::list<AbstractBlock*> Universe::getLoadedBlocks() { ... }
^^^^^^^^^^^^^^^^^^^^^^^^^ // This returns a copy of the list
因此,universe.getLoadedBlocks().begin()
使用列表的一个副本,universe.getLoadedBlocks().end()
使用列表的不同副本。这就是迭代器不兼容的原因(即它们来自不同的列表)。
换句话说,一个列表实例的begin
迭代器永远不会等于来自不同列表实例的end
迭代器。
如果您不更改getLoadedBlocks()
功能,可以尝试:
std::list<AbstractBlock*> values = universe.getLoadedBlocks();
for (i = values.begin(); i != values.end(); i++) // Note: You should use ++i here (for possible efficiency benefits)
{
window.draw((*i)->draw());
}
正如Jarod42指出的那样,你也可以使用更方便/简洁的基于范围的for循环,假设你使用的是兼容C ++ 11的编译器。
for (auto& block : universe.getLoadedBlocks())
{
window.draw(block->draw());
}