namenskonflikte....
-
wie frei kann man bei c++ eigendlich die namen für funktionen, klassen, ect.
wählen??ich hab das mal mit dem g++ 3.(anything) versucht
und hierbei gab es überall namenskonflikte:struct aaa{ int x; }; enum aaa{ bbb }; enum bbb{ aaa }; void aaa(){ /* ... */ }
natürlich hab ich das nicht so kompiliert wies da steht,
sondern immer paarweise...dass es bei den structs und den enums zu konflikten kommt is mir schon
klar, aber ich hab gedacht das es bei der funktion funktioniert, da
funktionen ja nicht nur auf den namen geprüft werden...muss das jetz vom standart her so sein oder liegt das am kompieler??
mfg
Plassy[ Dieser Beitrag wurde am 02.07.2003 um 18:02 Uhr von Plassy editiert. ]
-
angenommen du hast eine Klasse A und eine Funktion A, was soll dann A() sein? Funktionsaufruf oder Konstruktion eines temporären Objektes?
-
Original erstellt von Plassy:
muss das jetz vom standart her so sein oder liegt das am kompieler??Ich glaub das muss vom Standard her so sein. Sagen wir mal du übergibst an eine Funktion einen Funktionspointer auf aaa. Jetzt ist nicht klar: Will der das enum benutzen oder einen Pointer auf die Funktion...
Blödes Beispiel:
int c = reinterpret_cast<int>(aaa); // Funktionspointer oder int aus dem enum
Oder irre ich mich? Hilfe!!! War spät gestern...
-
angenommen du hast eine Klasse A und eine Funktion A, was soll dann A() sein? Funktionsaufruf oder Konstruktion eines temporären Objektes?
natürlich... eigendlich logisch
thx
Plassy
-
Hallo,
der C++ Standard *erlaubt* die Deklaration einer Funktion A auch wenn es bereits eine Klasse A im selben Scope gibt. In diesem Fall *verdeckt* die Funktion die Klasse. Will man die Klasse referenzieren muss man in diesem Fall den Namen mit class/struct/enum/union qualifizieren.
Dieses Programm ist also legales C++:struct A {}; void A() {} int main() { A(); // Funktion A struct A obj; // neues Objekt obj //A a; // Fehler a }
Anders sähe es hiermit aus:
typedef struct {} A; void A() {} int main() {}
In diesem Fall wäre die Funktion illegal, da A bereits deklariert ist.
Schön erklärt wird das ganze in Dan Saks' Artikel:
Tag vs. Type Names
-
thx @HumeSikkins