2011-07-12 7 views
5

Dlaczego tak jest?C++ name space confusion - std :: vs :: vs brak prefiksu w wywołaniu tolower?

transform(theWord.begin(), theWord.end(), theWord.begin(), std::tolower); - nie działa transform(theWord.begin(), theWord.end(), theWord.begin(), tolower); - nie działa

ale

transform(theWord.begin(), theWord.end(), theWord.begin(), ::tolower); - działa

theWord jest ciągiem. Mam using namespace std;

Dlaczego działa z prefiksem ::, a nie z numerem std:: lub bez niczego?

dzięki za pomoc.

+0

Jakie pliki nagłówka jesteś tym? –

+0

'#include #include #include #include #include #include #include ' – user839913

Odpowiedz

16

using namespace std; instruuje kompilator wyszukiwania dla nazw undecorated (tj te bez :: e) w std jak również nazw root. Teraz tolower patrzysz jest częścią biblioteki C, a więc w obszarze nazw korzenia, który jest zawsze na ścieżce wyszukiwania, ale może być również wyraźnie odwołuje się ::tolower.

Jest też std::tolower jednak, która przyjmuje dwa parametry. Kiedy masz using namespace std; i próbujesz użyć tolower, kompilator nie wie, który z nich masz na myśli, i dlatego "staje się błędem.

Jako takie, trzeba użyć ::tolower określić chcesz jeden w obszarze nazw root.

To, nawiasem mówiąc, jest przykładem dlaczego using namespace std; może być złym pomysłem. Jest wystarczająco dużo losowych rzeczy w std (a C++ 0x dodaje więcej!), Że jest całkiem prawdopodobne, że mogą wystąpić kolizje nazw. Zalecam, abyś nie używał using namespace std; i raczej jawnie używał, np. using std::transform; w szczególności.

+0

Więc :: tolower opowiada wygląd kompilatora w przestrzeni nazw root i std :: tolower mówi kompilatorowi, aby spojrzał na standardową przestrzeń nazw. Czy to jest poprawne? I w tym przypadku chcę, aby tolower z głównej przestrzeni nazw nie był standardową przestrzenią nazw. – user839913

+0

Dobrze. Czy można zaprzestać używania 'using namespace std' i tolower będzie działać poprawnie :) – bdonlan

+3

Technicznie OP :: tolower() istnieje tylko ze względu na szczegóły realizacji. Aby zagwarantować, że biblioteka '' tolower' biblioteki C znajduje się w globalnym obszarze nazw, '' musi być dołączone '' '' zamiast '' (patrz 'D.5 [depr.c.headers]/2') – Cubbi

Powiązane problemy