2012-06-22 8 views
6

Tengo un proyecto que funciona bien bajo MSVS 2010 SP1. Estoy tratando de convertirlo a MSVS 2012 RC. Tuve que cambiar algunas cosas, principalmente relacionadas con rutas de cabecera/lib de C++ y material personalizado de MFC. Pero tengo un último obstáculo que limpiar.Conversión del proyecto MSVS 2010 a MSVS 2012 RC pero aparece el error "El estándar C++ no proporciona un hash para este tipo"

En MSVC 2010, estoy usando un montón de unordered_map<basic_string<TCHAR>, int> o map<basic_string<TCHAR>, int>. Compila bien. Pero en MSVS 2012, acabo de recibir este error: "El estándar de C++ no proporciona un hash para este tipo"

Después de buscar un poco en la red, descubrí que MSVS 2012 debería estar más cerca del C++ 11 estándar, y que el estándar solo define funciones hash para tipos básicos y 4 tipos de cadenas definidas (entre ellas string y wstring, pero basic_string no incluidas). Así que cambié todos basic_string<TCHAR> a wstring pero fue en vano ... Todavía recibo el mismo error.

¿Qué debo hacer para poder volver a compilar mi aplicación?

+0

Probablemente en VS2010 tenía deshabilitado multibyte, por lo que 'TCHAR' mapeado a' char' y ahora tiene caracteres multibyte habilitados para que 'TCHAR' se asigne a' wchar_t'. Intente cambiar esta configuración en las propiedades del proyecto. – RedX

+1

'basic_string ' es 'std :: string' o' std :: wstring' (ambos simplemente typedefs), dependiendo de la configuración de su proyecto. La única diferencia en C++ 11 es que la cadena 'hash <>' ahora está en '' y no ''. –

+0

Gracias Bo, tuve que incluir en todas partes, mientras que antes no tenía que hacerlo. Tengo que esperar 6 horas antes de poder dar una respuesta ... Mientras tanto, siéntete libre de hacerlo tú mismo :) – OOEngineer

Respuesta

8

Aparentemente OOEngineer usó basic_string sin incluir el encabezado <string>. Parte de la funcionalidad puede ser visible de todos modos, a través de indirectas incluidas por otros encabezados.

Cuando se lanzó VS2010, la norma entonces propuesta puso todas las especializaciones std::hash<> en el encabezado <functional>. En la final de C++ estándar 11 se decidió que era mejor poner esto junto con el contenedor correspondiente, por lo que algunas especializaciones hash<> fueron trasladados a <string>, <vector>, etc.

Así, utilizados todos (o cualquier , realmente) funcionalidad de std::string, debe incluir el encabezado <string> usted mismo y no depender de otro encabezado de sistema que lo haga.

Cuestiones relacionadas