我有这个:
for (list<Docente>::iterator it3 = ((*it2).getDocentes()).begin(); it3 != ((*it2).getDocentes()).end(); it3++)
Run Code Online (Sandbox Code Playgroud)
这((*it2).getDocentes)返回一个Docentes列表.那么为什么说列表迭代器不兼容呢?有帮助吗?
方法getDocentes():
list <Docente> getDocentes() const;
list <Docente> EdicaoDisciplina :: getDocentes() const
{
return docentes;
}
Run Code Online (Sandbox Code Playgroud)
错误:
表达式:列表迭代器不兼容
您没有提供足够的信息.
如果您获得有关不兼容迭代器的典型MS Visual C++运行时断言,那么我怀疑您按值getDocentes()返回列表,即它返回原始容器的临时副本.这意味着在一个临时副本上调用它,并在完全不同的临时副本上调用.这使得迭代器返回并且不兼容,因为比较指向不同容器的迭代器是非法的.某些运行时库的调试版本可以捕获此类错误并发出运行定时器断言失败.begin()end()begin()end()
*it2由于按值返回结果,因此甚至可能更早发生相同的问题.
编辑:正如我猜测的那样,你getDocentes()的价值会返回结果.这实际上毫无意义,灾难性的低效.像列表这样的重型对象不应该按值传递.通过引用返回它
const list <Docente>& EdicaoDisciplina :: getDocentes() const
{
return docentes;
}
Run Code Online (Sandbox Code Playgroud)
现在你必须使用const_iterator而不是iterator(并失去所有这些过多的对())
for (list<Docente>::const_iterator it3 = it2->getDocentes().begin();
it3 != it2->getDocentes().end();
++it3)
...
Run Code Online (Sandbox Code Playgroud)
最后,it2->getDocentes().end()对每次迭代进行评估也不是一个好主意
for (list<Docente>::const_iterator
it3 = it2->getDocentes().begin(),
it3_end = it2->getDocentes().end();
it3 != it3_end;
++it3)
...
Run Code Online (Sandbox Code Playgroud)