Es mag sein, dass man in einem Anfängerprojekt praktisch nie tatsächlich Probleme damit bekommen wird. Aber sobald es etwas komplexer wird, gibts da meiner Erfahrung nach schneller Probleme, als man vielleicht denken mag. Zusätzliche Libraries sind genauso wenig abwegig wie eigene Stringklassen (UTF-8 anyone?) und string ist ja jetzt bei weitem nicht der einzige Name, der im namespace std so zu finden wäre. vector, list, min, max, array, queue, thread, mutex, yield, lock, exception...das sind nicht gerade Namen mit Seltenheitswert...
Abgesehen davon, widerspricht es einfach der Grundidee von Namensräumen, in einem Header, der an allen möglichen Stellen eingebunden werden soll, den globalen Namensraum mit allem möglichen Kram zuzumüllen. Und auch wenn man vielleicht einige Zeit lang damit davonkommt: Wenn es dann auf einmal doch plötzlich eine Namenskollision gibt den ganzen vorhandenen Code auszumisten und anzupassen, ist alles andere als spaßig...
An using Direktiven und Deklarationen in einer .cpp Datei ist imo absolut nichts auszusetzen. Auch in Headern ist beides völlig in Ordnung und sehr praktisch, so lange man es benutzt, um Namen in andere namespaces zu holen etc. Problematisch wird es, sobald der globale Namensraum verpestet wird, das sollte man in Headern imo einfach aus Prinzip schon nicht tun. Nur weil man ganz sicher weiß, dass im Moment dadurch nicht alles sofort in die Luft fliegen wird, ist es noch lange nicht auch gleich eine gute Idee...