2010-08-17 16 views
5

Actualmente estoy migrando de Visual Studio 2008 a 2010. Mi software hace un uso intensivo de Boost y sus funciones TR1. Ahora recibo muchos errores de compilación, porque VC10 tiene su propia implementación de TR1.TR1 de Boost o VC10 - ¿Cuál es mejor?

Sé que puedo deshabilitar la implementación TR1 de Microsoft con el interruptor _HAS_CPP0X (vea here), pero no estoy seguro de si esto también desactiva otras características que podrían ser interesantes en el futuro.

Entonces, me pregunto cuál es la mejor implementación de TR1: la de Boost o la de Microsoft? ¿Hay alguna diferencia en absoluto? ¿Deshabilitar la implementación de Microsoft tiene alguna desventaja?

+0

No es que esta es la respuesta que está buscando ... Si deshabilita Microsoft tr1, no puede compilar sin impulso. Si usa boost, puede estar seguro de que tendrá una ruta de actualización constante, y su código se compilará fuera de MSVC. Eso, y boost tiene muchas más características que solo las de TR1 :) –

+0

¿Cuál es el error exacto, las definiciones duplicadas? – MSalters

+0

Sí, el error exacto es definiciones duplicadas. También tiene algo que ver con ADL.Si califico cada aparición de bind o _1 (std :: bind y std :: tr1 :: placeholders :: _ 1) el código pronto se volverá muy desagradable :) –

Respuesta

1

Si su código no se compila con la biblioteca estándar de VC10, eso podría indicar que no cumple con las normas. La biblioteca estándar en VC10 proviene de Dinkumware, y estos tipos no son malos cuando se trata de implementar una biblioteca estándar. (PJP solía ser la presidenta del grupo de trabajo de lib). Miraría muy de cerca cada problema, antes de descartarlo como un problema específico de VC, para que no sea compatible en el futuro.

Además, TTBOMK, VC10 no solo vienen con TR1, pero con C++ 1x (por ejemplo, en lugar de std::shared_ptrstd::tr1::shared_ptr; ICBWT), por lo impulso de las bibliotecas y de VC10 en realidad no son totalmente comparables.

+0

¿Ha comprobado la implementación de su lista? No he visto el que vino con el vs2010, pero antes todos tenían una complicidad lineal para empalmar. – leiz

+1

@leiz: No, no lo hice. (Rara vez terminaba usando una lista, incluso cuando comencé a hacerlo. Generalmente, el vector resulta ser mejor). Pero yo estaba diciendo que, cuando el código ni siquiera _compila_ usándolo, lo miraría muy de cerca antes de descartarlo. esto como un problema con la implementación de la biblioteca, en lugar de un problema con el código, porque, en general, su implementación es bastante buena. Sin embargo, eso no significa que creo que no hay ningún problema en la implementación de Dinkumware. Dinkumware es dirigido por humanos. – sbi

+0

@leiz: C++ 0x ahora especifica que 'splice' debe ser O (1) y autoriza' size' a ser O (n) para list (porque los dos son incompatibles), no sé si o no fue el caso de C++ 03. –

0

Primero de:
Debería poder utilizar Boost y TR1 uno al lado del otro. Si todo está configurado correctamente y no está jugando con using namespace, no obtendrá ningún error.

C++ 11 proporciona características como la auto palabra (more info) o inicialización de los atributos de clase durante su declaración (more info) que Boost no puede proporcionar.

En el otro lado Boost proporciona mucho más que solo su implementación de las características de C++ 11. Essentially Boost es una colección de bibliotecas que se consideran agregadas al estándar C++.

Cuando se trata de características que proporcionan tanto (como shared_ptr) Yo recomiendo usar Boost:

  • Boost compila con los compiladores, que no son compatibles con ciertas características de C++ 11
  • Usted tiene una clara dependencia en lugar de simplemente retransmitir en C++ 11 (que la mayoría de los compiladores implementan diferente)
  • Los tipos de datos de refuerzo (por ejemplo, shared_ptr) son compatibles con otras funciones de Boost como serialization.

Mi sugerencia es utilizar C++ 11 solo si es absolutamente necesario y se impulso en todos los demás casos.

Cuestiones relacionadas