2009-08-04 13 views
28

Diferentes compiladores parecen tener diferentes ideas sobre TR1. G ++ sólo parece aceptar incluye del tipo:¿Cómo se incluye TR1?

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

Mientras Microsoft de compilador sólo acepta:

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

En cuanto a lo que tengo entendido TR1, la forma en que Microsoft es la correcta.

¿Hay alguna manera de que G ++ acepte la segunda versión? ¿Cómo maneja uno en general TR1 de una manera portátil?

+5

TR1 no es realmente parte del estándar C++, por lo que la forma "correcta" de incluir estos archivos de encabezado no estándar debe ser irrelevante. –

Respuesta

16

Instale el impulso en su máquina.
Agregue el siguiente directorio a su ruta de búsqueda.

< Boost directorio de instalación >/aumentar/TR1/TR1

ver aquí para más detalles boost tr1

Ahora cuando se incluye la memoria < > se obtiene la versión TR1 de memoria que tiene std :: TR1 :: shared_ptr y luego incluye la versión específica de la plataforma <memory> para obtener todos los extras normales.

+1

+1. Como TR1 parece ser "permite importar estas clases de impulso al estándar" – KitsuneYMG

+0

, hago '#include" boost/tr1/unordered_map.hpp "' y usa la implementación tr1 si está disponible. –

4

Quizás la mejor manera sea simplemente usar las bibliotecas boost por ahora, ya que en muchos casos tienen alternativas con una interfaz similar a las características TR1, y están en una ruta de encabezado y espacio de nombres diferentes (pero consistentes). Esto tiene la ventaja de trabajar en compiladores que ni siquiera han comenzado implementando C++ 0x. Y hay muchas bibliotecas de impulso útiles que no están en el TR1 en absoluto :)

O bien, en G ++, puede intentar pasar --std = gnu ++ 0x en la línea de comandos. Esto funciona para < unordered_set> y < unordered_map>, al menos. Luego, para que esté disponible en std :: tr1:

namespace std { namespace tr1 { using namespace std; } } 

Esto es malo, naturalmente. Recomiendo encarecidamente el enfoque de impulso en su lugar :)

+0

Usar -std = C++ 0x o -std = gnu ++ 0x no funciona, ya que solo hará que std :: unordered_set <> esté disponible, pero no std :: tr1 :: unordered_set <>. – Grumbel

+0

@Grumbel, actualizado con un hack malvado que lo hará disponible en std :: tr1 – bdonlan

3

Quizás un poco hacky, pero simplemente podría agregar el directorio tr1 del compilador a su ruta de inclusión.

2

Si está en Windows, agregue el directorio 'tr1' a la ruta del sistema. Entonces #include <memory> debería funcionar.

+0

¿los compiladores en Windows usan la ruta del sistema así como también la ruta include cuando resolver incluye? –

+0

No, no es así. –

2

Me hice la misma pregunta. Desafortunadamente, el informe técnico no dice cómo deberían incluirse los encabezados. Solo define que las extensiones deben estar en el espacio de nombres :: std :: tr1.

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

Probablemente deberías basar la compilación condicional en el compilador, no en la plataforma ('_WIN64' es real):' # si está definido (_MSC_VER) && (_MSC_VER> 1300) ', por ejemplo. – IInspectable

+0

En la última inclusión, tr1 está mal escrito como trL;) –

Cuestiones relacionadas