2009-08-04 11 views
28

Verschiedene Compiler scheinen unterschiedliche Vorstellungen von TR1 zu haben. G ++ scheint nur enthält der Typ zu akzeptieren:Wie enthält man TR1?

#include <tr1/unordered_map> 
#include <tr1/memory> 
... 

Während Microsofts Compiler nur akzeptieren:

#include <unordered_map> 
#include <memory> 
... 

Was wie ich sie verstehe TR1, die Microsoft Weg der richtige ist.

Gibt es eine Möglichkeit, G ++ die zweite Version zu akzeptieren? Wie wird TR1 im Allgemeinen auf tragbare Weise gehandhabt?

+5

TR1 ist nicht Teil des C++ - Standards, daher muss die "richtige" Methode, diese nicht standardmäßigen Header-Dateien einzubeziehen, strittig sein. –

Antwort

16

Installieren Sie Boost auf Ihrem Computer.
Fügen Sie Ihrem Suchpfad das folgende Verzeichnis hinzu.

< Boost-Installationsverzeichnis >/boost/tr1/tr1

siehe hier boost tr1 Details

Nun, wenn Sie umfassen <Speicher> Sie die TR1-Version Speicher erhalten, die std :: hat tr1 :: shared_ptr und dann enthält es die plattformspezifische Version von <Speicher>, um alle normalen Leckereien zu bekommen.

+1

+1. Da TR1 scheint "Lassen Sie diese Boost-Klassen in den Standard importieren" – KitsuneYMG

+0

Ich habe '#include" boost/tr1/unordered_map.hpp "' und es verwendet die tr1-Implementierung, wenn sie verfügbar ist. –

4

Vielleicht wäre der beste Weg, einfach boost Bibliotheken für jetzt zu verwenden, wie in vielen Fällen haben sie Alternativen mit einer ähnlichen Schnittstelle zu TR1-Features, und sind nur in einem anderen (aber konsistenten) Header-Pfad und Namespace. Dies hat den Vorteil, an Compilern zu arbeiten, die nicht begonnen haben, C++ 0x zu implementieren. Und es gibt viele nützliche Boost-Bibliotheken, die überhaupt nicht in TR1 sind :)

Alternativ können Sie in G ++ versuchen, --std = gnu ++ 0x in der Befehlszeile zu übergeben. Dies funktioniert für < unordered_set> und < unordered_map> zumindest. Um es dann in std :: tr1 verfügbar zu machen:

Das ist natürlich böse. Ich empfehle den Boost-Ansatz stattdessen :)

+0

Die Verwendung von -std = C++ 0x oder -std = gnu ++ 0x funktioniert nicht, da nur std :: unordered_set <> verfügbar ist, aber nicht std :: tr1 :: unordered_set <>. – Grumbel

+0

@Grumbel, mit einem bösen Hack aktualisiert, die es in std :: tr1 – bdonlan

3

Ein bisschen hacky vielleicht, aber Sie könnten einfach den Compiler tr1 Verzeichnis zu Ihrem Include-Pfad hinzufügen.

2

Fügen Sie unter Windows das Verzeichnis 'tr1' zum Systempfad hinzu. Dann sollte #include <memory> funktionieren.

+0

zur Verfügung stellen Compiler auf Windows verwenden den Systempfad sowie den Include-Pfad, wenn die Auflösung beinhaltet? –

+0

Nein, das tun sie nicht. –

2

Ich fragte mich die gleiche Frage. Leider sagt der technische Bericht nicht, wie die Header enthalten sein sollten. Es definiert nur, dass die Erweiterungen im Namensraum :: std :: tr1 sein sollten.

12
#ifdef _WIN32 
    #include <unordered_map> 
    #include <memory> 
#else 
    #include <tr1/unordered_map> 
    #include <trl/memory> 
#endif 
+0

Sie sollten die bedingte Kompilierung wahrscheinlich auf dem Compiler basieren, nicht auf der Plattform ('_WIN64' ist real):' #if definiert (_MSC_VER) && (_MSC_VER> 1300) Beispiel: – IInspectable

+0

Beim letzten Include ist tr1 falsch geschrieben als trL;) –

Verwandte Themen