Globale Bezeichner wieder loswerden
-
Hallo,
ich habe den Fall, dass ich eine externe Bibliothek verwenden muss. Leider hatte der Ersteller dieser Bibliothek anscheinend keine Ahnung, was ein using namespace in Headern für Probleme verursachen kann. Kurz gesagt: Der globale Namensbereich ist total verseucht und jetzt habe ich leider dauernd Fehler, dass ich Sachen zweimal definiert habe. Ich weiß aber, dass die doppelten Bezeichner nicht wichtig für die Funktionsweise der Bibliothek sind, sondern einfach nur vom Autor "versehentlich" in den globalen Namensbereich geholt wurden, jedoch nicht benutzt werden. Fällt da irgendjemandem eine Methode ein, wie ich die Bezeichner loswerden könnte, so dass ich nicht a) Mein ganzes Programm umarbeiten muss oder b) Die Header der Bibliothek komplett umarbeiten muss?
edit: Um das nochmal klarer zu machen, ungefähr sowas habe ich:
// Einer der Standardheader: class std::count{[...]}; [...] // Bibliotheksheader, bindet den Standardheader ein using namespace std; [...Code der niemals count benutzt...] // Mein Programm, benutzt Bibliotheksheader void count(){}; [...] count(); //Fehler: reference to 'count' ist ambigiousIch bräuchte sowas wie 'undefine count'
-
wenn's nur wenige Dateien mit includes dieser Bibliothek sind, dann kannst Du folgendes machen:
- Standard-Header, die von den Bib-Headern inkludiert werden vor(!) den Bib-Headern nochmal inkludieren
- #include <bib/Header.h> mit einem named namespace klammern
also z.B.#include <algorithm> // count #include .. sonstiges aus dem Standard namespace murx { #include <bib/Header1.h> #include <bib/Header2.h> }die using-namespace-std-Deklaration endet mit dem namespace murx, und wirkt danach nicht mehr.
Anschließend müssen natürlich die Bib-Methoden mit murx::bibFunktion aufgerufen werden.Gruß
Werner
-
Ausgezeichneter Vorschlag, das passt genau auf mein Problem. Dankeschön!
-
Und was sagt der Linker dann dazu? Die Bibliotheksfunktionen dürften jetzt doch nicht mehr gefunden werden, da sie den falschen Namensbereich haben...
-
Anderer Vorschlag: Benutze für Deinen Kram einen eigenen Namensraum. Dann kann Dir die "Verschmutzung" von :: mehr oder weniger egal sein.
Gruß,
SP
-
Ja, da war ich etwas voreilig, weil's bei meinem Testfall funktioniert hat. Aber beim wirklichen Problem hat's nicht funktioniert, unter anderem, weil die von der Bib eingebundenen Standardheader nur im globalen Namensbereich funktionieren. Der umgekehrte Vorschlag von Sebastian Pizer funktioniert aber und ist genauso wenig Arbeit.