2011-02-08 24 views
23

Me gustaría tener un std :: map (int .NET 4.0). Por supuesto, sabemos que un mapa es un árbol y requiere un operador < que la cadena no define para nosotros.Usando std :: string como clave para std :: map

Error 24 Error C2676: binario '<': 'const std :: string' no define este operador o una conversión a un tipo aceptable para el operador predefinido c: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ VC \ include \ xfunctional 125 1 FXCMMarketDataServer

Así que puse mi google-foo a trabajar y encontró esta solución:

struct StringComparerForMap 
{ 
public: 
    bool operator()(const std::string x, const std::string y) 
    { 
     // Add compare logic here 
    } 
}; 

... 
std::map<std::string, CustomObject, StringComparerForMap> myMap; 

esto funcionó bien durante un tiempo, y ahora estoy encontrando un error que creo que se debe a esto. En algún lugar en el fondo del marco STL parecería que ignora la definición anterior y se predetermina al operador <.

¿Hay alguna manera en VS2010 .NET 4.0 de utilizar una cadena como la clave de un mapa?

Entiendo que puedo tomar esa cadena y escribir una función para hash it en un int, pero ¿dónde está la diversión en eso?

EDITAR

voy a tratar de explicar esto lo mejor que pueda para David. Cuando el mapa utiliza la estructura comparer, se bloquea en la versión y falla una aserción de depuración en la depuración. La aserción de que no está en línea XTree 1746.

de expresión: operador no válido <

| Abortar | | Reintentar | Ignorar |

Eso es lo que me lleva a creer que, a pesar de dar un mapa a un comparador, sigue por ciertas rutas el operador predeterminado < para la comparación. La línea en mi código que hace esto es:

CustomObject o = stringObjectMap[key]; 
+7

std :: string tiene una definición adecuada del operador requerido. ¿Estás seguro de haber incluido el encabezado ? Creo que he visto problemas similares cuando no lo incluí; forward declares de std :: string significa que su nombre es conocido. – Keith

+3

.NET no tiene nada que ver con std :: map o std :: string –

+3

¿Qué le hace pensar que en el fondo de las capas de la biblioteca por defecto es '<'? Si fuera así, estaría roto y deberías presentar un informe de error, pero lo más probable es que estés malinterpretando los datos: ese error se desencadenaría en muchas otras situaciones, es probable que alguien lo haya detectado antes ...Cuando le dije a mi primer jefe que el compilador estaba equivocado, sonrió y dijo: * el 99% del tiempo, el problema se encuentra entre la silla y el teclado y no en el compilador * –

Respuesta

67

Error 24 Error C2676: binario '<': 'const std :: string' no define este operador o una conversión a un tipo aceptable para el operador predefinido c: \ archivos de programa \ microsoft visual Studio 10.0 \ VC \ include \ xfunctional 125 1 FXCMMarketDataServer

Eso es lo VC escupe en la cara cuando se le olvidó incluir <string>. Ese encabezado definitivamente define este operador.

+1

Esto me pasó a mí, pasó una hora jugando con mapas y sigue obteniendo este error una y otra vez. Pensé: "¿Por qué fallan todos los ejemplos en Internet?". Resulta que olvidé un encabezado de cadena maldito. Me siento un poco tonto ahora ... – Joseph

Cuestiones relacionadas