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];
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
.NET no tiene nada que ver con std :: map o std :: string –
¿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 * –