2012-01-23 19 views
7

Estoy tratando de usar la función C++ 11 emplace() de un mapa, pero NetBeans dice que un mapa no tiene esa función. Mirando los encabezados, está "bien" - no hay mención (en Fedora 16) de emplace(). Lo cual está muy bien, ya sabes ... pero quiero usar emplace().std :: map :: emplace() falta - ¿bibliotecas desactualizadas?

¿Cómo hago para habilitar esta funcionalidad? Sé con certeza que existe desde marzo del año pasado, probablemente antes. Una búsqueda exhaustiva muestra que emplace() básicamente solo existe en mi sistema en los encabezados de listas y vectores. Dado que no ha habido una revisión importante de C++ en casi una década, no estoy teniendo suerte para encontrar documentación sobre qué hacer si las bibliotecas están "equivocadas".

+1

@CharlesBailey: Lo que estaba tratando de decir fue "ya que no hubo una revisión mayor en la década anterior a C++ 11 No tengo idea de lo que la gente suele hacer en tales situaciones" – PlasmaHH

+0

¿Qué compilador estás usando y qué versión? –

+0

@David Brown GCC 4.6.2, aunque me gustaría que también se compile en mi servidor (GCC 4.4.5). – DigitalMan

Respuesta

2

Si su implementación no soporta algo, usted tiene dos opciones:

  • no utilice la función
  • uso otra aplicación que le apoya lo que necesita.

El hecho de que haya un nuevo estándar no amplía las opciones. De hecho, lo reduce ya que tendrá dificultades adicionales para encontrar una implementación que admita todo lo que desea para cada uno de sus objetivos.

Tenga en cuenta que para las cosas de biblioteca pura, la otra implementación podría ser una que usted haga: las envolturas de compatibilidad tienen una apariencia mejorada en el tiempo de transición. Pero debe prestar atención a los efectos de los conflictos de nombre (la visibilidad de los envoltorios de compatibilidad puede agregar ambigüedades al código cuando la característica aparece en su lugar estándar).

+0

Entonces, si estoy entendiendo esto correctamente, la "Biblioteca GNU ISO C++" simplemente no admite la función todavía? ¿Hay alguna forma de verificar qué versión de la implementación tengo y si es la última? Alguien, en alguna parte, lo ha hecho funcionar (sin haber encontrado nunca este problema), simplemente no sé exactamente qué estaban usando. – DigitalMan

+0

@DigitalMan - Gran parte del soporte de C++ 11 está dirigido a GCC 4.7 porque existen serias incompatibilidades de API en la biblioteca. –

+0

@Bo Persson Gracias por la sugerencia. De las [notas de la versión 4.7 de GCC] (http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x), el soporte para contenedores asociativos es parcial: miembros de ubicación faltantes. _Solo_ los miembros del conjunto. Inserta todo tipo de improperios aquí. – DigitalMan

1

GCC 4.7 no es compatible con esto ya que hubo problemas no resueltos con el estándar en ese momento. Se implementa en 4.8 y superior. Necesitará -std = C++ 11

Cuestiones relacionadas