Вы не можете сделать это, используя просто typedefs.
Подставляя B для его typedef:
typedef map<C, B::iterator> A;
typedef list<D, A::iterator> B;
становится:
typedef map<C, list<D, A::iterator>::iterator> A;
typedef list<D, A::iterator> B;
Затем подставляя A для его typedef:
typedef map<C, list<D, map<C, list<D, A::iterator>::iterator>::iterator>::iterator> A;
typedef list<D, A::iterator> B;
Эта замена будет длиться вечно, без свертывания ...
edit: Я должен отметить, что если вы создадите классы-обертки вокруг карты и списка, вы можете объявить классы вперед.