Nazwy w języku C++ mogą odnosić się do zmiennych, funkcji, struktur, wyliczeń, klas i składowych struktur oraz klasklas. Kiedy projekt programistyczny rozrasta się, rośnie też ryzyko kolizji tych nazw. Ryzyko to zwiększa się jeszcze bardziej, jeśli w projekcie wykorzystywane są biblioteki pochodzące z różnych źródeł. Może się bowiem zdarzyć, że w obu takich bibliotekach znajdą się kolidujące ze sobą definicje klas o nazwach List, Tree czy Node. Jeśli będziemy korzystać z wersji List z jednej biblioteki i wersji Tree z drugiej, obie będą oczekiwa' odmiennej implementacji klasy Node. Konflikty tego rodzaju określamy ogólnie mianem problemów przestrzeni nazw. Standars języka C++ przewidział do rozwiązywania takich problemów środek w postaci przestrzeni nazw dającym programistom lepszą kontrolę nad zasięgiem nazw. [...]
Źródło: Książka pt.: ,,Język C++ - szkoła programowania wydanie VI" - Stephen Prata
Odpowiedź do pytania 1 ^^^^^^^^^^.
Odpowedź na pytanie 2: W przestrzeni nazw tworzysz wszystko co chcesz, aby miało unikatową nazwę:
namespace przestrzen
{
class Klasa
{
...
}
int zmienn;
enum wyliczenie = {...};
//itd.
}
Odpowiedź do pytania 3: Czym mają się niby różnić? To są 2 odmienne rzeczy :)
Pozdrawiam