std::tr1 und std:: namespace supporten, aber wie am einfachsten?
-
#ifdef HAS_TR1 namespace ns = std::tr1; #else namespace ns = std; #endif
-
zeilenzähler schrieb:
Um eine Zeile und die Makrodefinition zu sparen, geht auch folgendes:
namespace std { namespace tr1 {} using namespace tr1; }Ich bin mir nicht sicher, ob das nach Standard erlaubt ist. Es wird aber mit jedem Compiler gehen
Was sollte hier nicht erlaubt sein? Die Lösung ist mir auch gleich eingefallen. Das ist sehr elegant. Und wenn das im Header steht, dann ist das in dem Fall gar nicht schlimm. Ich glaube, das ist der einzige Fall, in dem ich persönlich überhaupt "using namespace" verwenden würde. Ich verwende das auch nicht im cpp.
Nash26 schrieb:
eventuell möchte ich halt auch einen fall back anbieten wenn es diese methoden nicht gibt. z.B. weil C++ 2005 verwendet wird.
Was ist denn C++ 2005? Es gibt C++ 1998, 2003 und C++11, aber 2005 ist kein Standard raus gekommen.
-
ich bins schrieb:
Was ist denn C++ 2005? Es gibt C++ 1998, 2003 und C++11, aber 2005 ist kein Standard raus gekommen.
Ich denke er meint VS 2005
-
ich bins schrieb:
zeilenzähler schrieb:
Um eine Zeile und die Makrodefinition zu sparen, geht auch folgendes:
namespace std { namespace tr1 {} using namespace tr1; }Ich bin mir nicht sicher, ob das nach Standard erlaubt ist. Es wird aber mit jedem Compiler gehen
Was sollte hier nicht erlaubt sein?
Man darf dem
namespace stdkeine Definitionen hinzufügen.namespace tr1 {}ist doch eine Definition, von dem her sollte es nicht erlaubt sein.
-
out schrieb:
Man darf dem
namespace stdkeine Definitionen hinzufügen.namespace tr1 {}ist doch eine Definition, von dem her sollte es nicht erlaubt sein.Das ist eine Konvention der Standardbibliothek, die aber vom Compiler nicht geprüft wird. Daher funktioniert das auf jeden Fall.
-
ich bins schrieb:
out schrieb:
Man darf dem
namespace stdkeine Definitionen hinzufügen.namespace tr1 {}ist doch eine Definition, von dem her sollte es nicht erlaubt sein.Das ist eine Konvention der Standardbibliothek, die aber vom Compiler nicht geprüft wird. Daher funktioniert das auf jeden Fall.
Ja schon. Es geht aber ja auch nicht darum, ob es funktioniert oder nicht funktioniert, sondern ob es erlaubt oder nicht erlaubt ist. Das ist ein Unterschied.
-
out schrieb:
ich bins schrieb:
out schrieb:
Man darf dem
namespace stdkeine Definitionen hinzufügen.namespace tr1 {}ist doch eine Definition, von dem her sollte es nicht erlaubt sein.Das ist eine Konvention der Standardbibliothek, die aber vom Compiler nicht geprüft wird. Daher funktioniert das auf jeden Fall.
Ja schon. Es geht aber ja auch nicht darum, ob es funktioniert oder nicht funktioniert, sondern ob es erlaubt oder nicht erlaubt ist. Das ist ein Unterschied.
Es ist nicht Standardkonform. Und außerdem löst es das Problem des OP nicht (im Gegensatz zur Variante mit Namensraum-Alias).
-
Kellerautomat schrieb:
#ifdef HAS_TR1 namespace std { using namespace tr1; } #endifDas scheint mit die einzigste Lösung zu sein.
Nexus schrieb:
#ifdef HAS_TR1 namespace ns = std::tr1; #else namespace ns = std; #endifHier bekomme ich eine Fehlermeldung:
a symbol with this name already exists in the current scope
da ich dieses Aktion in mehreren Header mache.
Ich hatte noch überlegt, für diese neu std Objekte die ich brauche, abzuleiten...aber wäre wohl zu viel Veränderung
-
Nash26 schrieb:
Nexus schrieb:
#ifdef HAS_TR1 namespace ns = std::tr1; #else namespace ns = std; #endifHier bekomme ich eine Fehlermeldung:
a symbol with this name already exists in the current scope
da ich dieses Aktion in mehreren Header mache.
Dann nimm doch einfach entweder einen extra-Header oder mach einen Includeguard drumherum.
-
Nash26 schrieb:
Kellerautomat schrieb:
#ifdef HAS_TR1 namespace std { using namespace tr1; } #endifDas scheint mit die einzigste Lösung zu sein.
Funktioniert nur nicht. Ein std::tr1::is_function kann auch danach nicht als std::is_function angesprochen werden, da using-Direktiven keinen Einfluss auf qualifiziertes Lookup haben.
Nash26 schrieb:
Nexus schrieb:
#ifdef HAS_TR1 namespace ns = std::tr1; #else namespace ns = std; #endifHier bekomme ich eine Fehlermeldung:
a symbol with this name already exists in the current scope
da ich dieses Aktion in mehreren Header mache.
Ich hatte noch überlegt, für diese neu std Objekte die ich brauche, abzuleiten...aber wäre wohl zu viel Veränderung
Dann ist dein Compiler kaputt. Namespace-alias-Definitionen können wiederholt werden, sofern sie immer auf den gleichen Namensraum verweisen. Abgesehen davon gehören solche Dinge wohl in einen eigenen Kompatibilitätsheader, es ist also nur eine Frage der Organisation.
Und wenn es ur darum geht, standarkonform alles per using-Direktive hereinzuholen, kann auch ein Hilfsnamensraum dienen:
namespace std_all { using namespace ::std; #ifdef HAS_TR1 using namespace ::std::tr1; #endif }und dann eben std_all statt std in den using-Direktiven angeben. Ist aber nur bedingt sinnvoll.