szczerze powiem, ze nie wiem co jest w BDS, ale w sposobie traktowania C++ w tym przypadku miedzi msvc a g++ czy mingw, raczej różnic nie zauważam, wiec jesli cos jest dziwne - to wybacz, ale BDS..
"normalny"*) kompilator C++ z ustawiona zgodnoscia ze standardem, w momencie "zaczęcia czytania pliku" startuje w przestrzeni nazw "" (pustej, bez nazwy, globalnej, jak zwal tak zwal) i dopiero gdy przeczyta jakiekolwiek "namespace xxx{" to zaglebia sie w tę przestrzen i nastepujace po tym definicje traktuje jako umieszczone w niej'że.
kazdy naglowek z libstd, tak jak wspomniany <iostream>, dla porządku, ma w sobie namespace std { /i tu cala tresc naglowka/ }. czy to ifstream, czy to zwykly string, siedza one w std:: **)
piszac swoj plik z kodem, jezeli sam siebie wcisniesz do jakiejs przestrzeni nazw (otaczajac swoj kod namespacem), widzisz calosc natychmiast bez prefixow, bez usingow. jednak jesli sam siebie nie wcisniesz w namespace std{} i/lub nie napiszesz using std;, to nie masz prawa być w stanie odwolywac sie do definicji standardowego stringa bez użycia prefixu std:: ----- bo kompilator nie ma prawa domyslać sie że chodzi o ten wlasnie string - przeciez mozesz miec klase string jeszcze swoja na boku, albo trzy klasy string pochowane w roznych bibliotekach z ktorych tez korzystasz..
*) nie twierdze ze msvc czy g++ sa normalniejsze, kazdy z nich ma swoje odchyly..
**) mowie o naglowkach obecnego c++ czyli <iostream> czy <cmath> nie <iostream.h> czy <math.h>, ktore istnieja tylko aby dalo sie jeszcze kompilowac kody ze starych wersji standardu