Kolizje przestrzeni nazw ?

dział ogólny

Kolizje przestrzeni nazw ?

Nowy postprzez Slynx » sobota, 30 kwietnia 2011, 18:20

Główna klasa mojego programu ma strukturę xxx::yyy::Data
gdzie xxx i yyy są kolejnymi przestrzeniami nazw. Problem, a raczej błąd:

error C2872: 'Data' : ambiguous symbol
1> could be ' : xxx::yyy::Data'
1> or 'System::Data'


Myślałem na początku, że to kolizja z systemowymi przestrzeniami nazw (System::Data), ale usunąłem wpisy (using namespace) dla System oraz System::Data i nic się nie zmieniło.
W błędzie podaje, że ma "dylemat" czy chodzi mi o klasę system::data czy o moją. Jak to poprawić ? Bo wywoływanie za każdym razem całej struktury przestrzeni nazw jest czasochłonne i kod wygląda okropnie :/
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Kolizje przestrzeni nazw ?

Nowy postprzez polymorphism » sobota, 30 kwietnia 2011, 19:39

Opcji jest kilka:
  • zmień nazwę struktury
  • stwórz alias struktury typedefem
  • jeśli xxx i yyy są przestrzeniami nazw zdefiniowanymi przez namespace, wtedy możesz sobie je skrócić:
    KOD cpp:     UKRYJ  
    namespace zzz = xxx::yyy;
  • jawnie określaj całą przestrzeń (ta opcja Ci się nie podoba, więc jest ona ostatecznością).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kolizje przestrzeni nazw ?

Nowy postprzez Slynx » sobota, 30 kwietnia 2011, 20:15

Ok, typedef idealnie się do tego nadaje.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Kolizje przestrzeni nazw ?

Nowy postprzez Slynx » poniedziałek, 9 maja 2011, 00:05

Ok, mam jeszcze jedno pytanie. To działa, ale wewnątrz aktualnego pliku. Jak ustawić to globalnie lub - lepiej - wewnątrz konkretnej przestrzeni nazw ? Chciałem dorzucić to do głównego pliku projektu by było kompilowane jako pierwsze, ale nic. Potem podrzucić do głównej klasy, która jest załączona wszędzie, ale też nic. A gdy spróbuje od nowa to zdeklarować w innym pliku to wyrzuca błędy (rozumiem, że jedna deklaracja tego samego typu na jedną przestrzeń nazw by nie było kolizji między nimi).
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Kolizje przestrzeni nazw ?

Nowy postprzez polymorphism » poniedziałek, 9 maja 2011, 11:20

Globalnie tego nie ustawisz, bo jaki sens miałaby wtedy idea przestrzeni nazw? Możesz oczywiście spróbować stworzyć nagłówek z dyrektywami using namespace i załączać go wszędzie tam gdzie chcesz włączyć kilka przestrzeni nazw do innej.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kolizje przestrzeni nazw ?

Nowy postprzez Slynx » poniedziałek, 9 maja 2011, 13:45

Dorzuciłem to do precompiled header file, więc załączony będzie wszędzie i powinno funkcjonować w całej przestrzeni nazw. Na razie wszystko się elegancko kompiluje.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 3 gości