Q:

List iterators not compatible

I have this for:
for (list<Docente>::iterator it3 = ((*it2).getDocentes()).begin(); it3 != ((*it2).getDocentes()).end(); it3++)

This ((*it2).getDocentes) returns a list  of Docentes. So why does it say that list iterators are incompatible? Any help?
Method getDocentes() :
list <Docente> getDocentes() const;
list <Docente> EdicaoDisciplina :: getDocentes() const
{
    return docentes;
}

Error:
Expression: list iterators incompatible

A:

You haven't provided enough information.
If you get that typical MS Visual C++ run-time assertion about incompatible iterators, then I suspect that your getDocentes() returns the list by value, i.e. it returns a temporary copy of the original container. That means that begin() is called on one temporary copy and end() is called on a completely different temporary copy. That makes the iterators returned by begin() and end() incompatible, since it is illegal to compare iterators that point into different containers. Debug versions of some run-time libraries can catch such errors and issue run-timer assertion failures.
It is also possible that the same problem happens even earlier, because of *it2 returning its result by value. 
EDIT: Just as I guessed, your getDocentes() returns its result by value. This is virtually meaningless and catastrophically inefficient. Such heavy objects as lists are not supposed to be passed around by value. Return it by reference
const list <Docente>& EdicaoDisciplina :: getDocentes() const
{
    return docentes;
}

Now you have to use const_iterator instead of iterator (and lose all these excessive pairs of ())
for (list<Docente>::const_iterator it3 = it2->getDocentes().begin(); 
     it3 != it2->getDocentes().end(); 
     ++it3)
  ...

Finally, evaluating it2->getDocentes().end() on every iteration is not a good idea either
for (list<Docente>::const_iterator 
       it3 = it2->getDocentes().begin(),
       it3_end = it2->getDocentes().end(); 
     it3 != it3_end; 
     ++it3)
  ...

