Mit TR1 Bibliotheken des GCC und MSVC
Ich möchte die TR1-Bibliotheken, die im Lieferumfang von modernen Versionen von GCC und MSVC, aber es gibt subtile Unterschiede: in GCC, ich muss sagen,
#include <tr1/memory>
std::tr1::shared_ptr<int> X;
während in MSVC ich muss sagen,
#include <memory>
std::shared_ptr<int> X;
Habe ich zwei Fragen: 1) Ist MSVC automatisch funktionieren in der C++0x-Modus (entspricht der GCC-std=c++0x), oder funktioniert es auch in C++98/03-Modus standardmäßig? 2) Wie kann ich das vereinheitlichen der includes und namespaces? Ich dachte über ein Präprozessor-makro in der Art "INCLUDE_TR1(Speicher)" oder so ähnlich.
Zu klären, möchte ich die Verwendung der bisherigen standard-C++98/03; nicht C++0x (sonst würde es kein problem sein).
Wäre ich sehr dankbar für Anregungen!
- std::tr1::shared_ptr funktioniert auf meinem MSVC10.
- Welche version von MSVC?
- MF: ich Danke Ihnen. TG: Die Allgemeine Antwort können Sie geben würde geschätzt!
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::result_of<>
nutzt die TR1 result_of-Protokoll stattdecltype
-basiert); in der Tat, viel von der standard-Bibliothek in VC++ 2010 ist eigentlich nicht im Namensraumstd
, sondern im namespacestd::tr1
und zog in namespacestd
mit einer using-Direktive.#include
den entsprechenden Header entsprechend auf Ihre Plattform, oder wenn für Ihre Plattform kein TR1-Unterstützung#include
den entsprechenden Boost-Implementierungen und ziehen Sie in den namespacestd::tr1
mit using-Deklarationen.std::shared_ptr<>
nur eine definition vonstd::tr1::shared_ptr<>
gezogen wird, dass in namespacestd
mit einer using-Direktive. So, natürlich mitstd::tr1::shared_ptr<>
ist sicher.tr1
im namespace. Aber, wenn ich mich Recht erinnere, ist es der GCC, die erfordert, dasstr1
im header Weg, und Visual Studio 2008 mit der Tr1-patch, der fügt nur die neuen Sachen zu den alten header.#include
s; mit GCC müssen Sie<tr1/memory>
in der Erwägung, dass mit VC++ 2008 SP1 oder VC++ 2010 müssen Sie<memory>
. Aber, das ist die Hälfte dessen Zweck zu Steigern.TR1-es#include
s die richtigen Header für dich, je nach Plattform.VC++ 2010 immer betreibt in C++0x-Modus, aber die Klassen gibt es in der
std
undstd::tr1
namespaces. Sie müssen erkennen, die der compiler mit einem#if _MSC_VER
zu wählen, welche Header enthalten (siehe diese Antwort).Den Boost.TR1 Bibliothek kann automatisch der compiler die Header und füllen Sie alle fehlenden Funktionalität mit Boost. Könnte es helfen.
OK, nachdem mehrere inkonsistente und unüberwindbaren Probleme mit Boost.TR1, vor allem, wenn Sie versuchen zu verwenden, GCC native TR1-Bibliotheken, habe ich beschlossen zu Graben Boost vollständig und verwenden Sie einen kleinen #define Abhilfe. Hier ist mein "tr1.h":
Ich kann jetzt nur schreiben, dass meine Programme so:
Den verschiedenen Versionen von MSVC haben die Funktionen, die Sie haben. Es gibt keine Möglichkeit, drehen Sie auf oder off.
Einige von Ihnen vielleicht auch beide tr1 und std-Versionen einige Funktionen. Mit leicht unterschiedlicher Semantik!