2012-05-24 9 views
14

Ich habe 03 Code C++, die wie folgt aussieht:Importieren von std :: tr1 in std - ist es legal? Verbessert es die Portabilität?

#include <boost/tr1/unordered_map.hpp> 
... 
std::tr1::unordered_map<std::string, int> mystuff; 
... 

Ich frage mich, begann zu, dass ich später würde leiden, wenn/wenn ich meinen Code C konvertieren 11 ++, die (i guess) doesn‘ t haben std::tr1::unordered_map aber hat std::unordered_map stattdessen. So kam ich mit dem folgenden Hack up:

namespace std 
{ 
    using namespace ::std::tr1; 
} 
... 
std::unordered_map<std::string, int> mystuff; // no tr1 now! 
... 

Ist es legal (vielleicht Sachen in std Import verboten ist)? Erleichtert es die Portierung/Interoperabilität mit C++ 11-Code?

+1

Mein Compiler (VS2010) versteht noch 'std :: tr1', obwohl jetzt auch alles in' std' existiert. – Benj

Antwort

16

Sie sollten den Namespace std nicht berühren: selbst wenn es jetzt funktioniert, kann es später (mit einer neuen Version des Compilers, auf einem anderen Compiler usw.) starke Kopfschmerzen verursachen.

Update: Zitat aus dem Standard (C++ 2003, Abschnitt 17.4.3.1 "Reservieren Namen") (gefunden here):

Es ist undefined für ein C++ Programm hinzufügen Erklärungen oder Definitionen Namespace std oder Namespaces innerhalb Namespace Std, sofern nicht anders angegeben. Ein Programm kann Vorlagenspezialisierungen für jede Standardbibliotheksvorlage zu Namespace-Standard hinzufügen. Eine solche Spezialisierung (vollständig oder teilweise) einer Standardbibliotheksvorlage führt zu einem nicht definierten Verhalten, es sei denn, die Deklaration hängt von einer benutzerdefinierten Art der externen Verknüpfung ab, und die Spezialisierung erfüllt nicht die Standardbibliotheksanforderungen für die ursprüngliche Vorlage. [Hervorhebung von mir]

+1

Ich denke, die einzigen interessanten Antworten sind jene, die durch einige Fakten unterstützt werden - wie "was der Standard dazu sagt". – akappa

+0

@akappa - siehe Update – Attila

+0

jetzt ist es viel besser (upvoted) – akappa

7

Sachen in ::std Importieren ist verboten, von C++ 11 17.6.4.2.1:

Das Verhalten einer C++ Programm nicht definiert ist, wenn es Erklärungen oder Definitionen fügt std zu Namespace oder zu einem Namespace im Namespace std, sofern nicht anders angegeben.

3

Ich denke, this question ist sehr ähnlich zu dem, was Sie fragen über.

Insbesondere mag ich die Antwort, die sagt "Verwenden Sie Autoconf, um Symbole Verfügbarkeit zu erkennen und dann bedingte definiert, um den richtigen Namespace mit einem bestimmten Namen Alias".

1

Diese Art der Portabilität sollte nur dann versucht werden, wenn Sie nachweisen können, dass Sie eine bestimmte Bibliothek nicht eindeutiger unterstützen können, und idealerweise sollten Sie sie mit #ifdef für diese spezielle Umgebung umgeben.

Der Punkt tr1 war Ihre std von den Sachen in tr1 zu isolieren.

Verwandte Themen