#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
¿Qué hace Windows si incluyo Windows.h? No puedo usar std::min
en Visual Studio 2005. El mensaje de error es:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
hidayat
fuente
fuente
Respuestas:
El
windows.h
archivo de encabezado (o más correctamente,windef.h
que incluye a su vez) tiene macrosmin
ymax
que están interfiriendo.Deberías
#define NOMINMAX
antes de incluirlo.fuente
No es necesario definir nada, simplemente omita la macro usando esta sintaxis:
fuente
min
omax
(ejemplo de caso de uso: implementar una clase que se ajuste al concepto UniformRandomNumberGenerator ).Como otros mencionaron, los errores se deben a macros mínimas / máximas que se definen en los encabezados de Windows. Hay tres formas de desactivarlos.
1)
#define NOMINMAX
antes de incluir el encabezado, esta es generalmente una mala técnica para definir macros para afectar los siguientes encabezados;2) definir
NOMINMAX
en la línea de comandos del compilador / IDE. La parte mala de esta decisión es que si desea enviar sus fuentes, debe advertir a los usuarios que hagan lo mismo;3) simplemente anule la definición de las macros en su código antes de que se utilicen
Esta es probablemente la solución más portátil y flexible.
fuente
Todavía tengo problemas ocasionalmente con los encabezados de Windows y la definición amplia del proyecto de NOMINMAX no siempre parece funcionar. Como alternativa al uso de paréntesis, a veces hago explícito el tipo así:
Esto también evita que el preprocesador coincida
min
y posiblemente sea más legible que la solución alternativa entre paréntesis.fuente
Intente algo como esto:
De forma predeterminada, windows.h define
min
ymax
como macros. Cuando se expanden, el código que intenta usarstd::min
(por ejemplo) terminará luciendo algo como esto:El mensaje de error le dice que
std::(x)
no está permitido.fuente
En mi caso, el proyecto no incluía
windows.h
niwindef.h
explícitamente. Estaba usando Boost. Entonces, resolví el problema yendo al proyectoProperties -> C/C++ -> Preprocessor
y agregandoNOMINMAX
elPreprocessor Definitions
(VS 2013, VS 2015).fuente
Para las personas que incluyan windows.h, coloque lo siguiente en los encabezados afectados:
En los archivos de origen solo #undef min y max.
fuente
es el truco para suprimir las definiciones macro de max y min
http://support.microsoft.com/kb/143208
fuente
Para resolver este problema, solo creo un archivo de encabezado llamado
fix_minmax.h
sin incluir guardiasEl uso básico es así.
Las ventajas de este enfoque es que funciona con todo tipo de archivo incluido o parte de código. Esto también le ahorra tiempo al tratar con códigos o bibliotecas que dependen de
min
/max
macrosfuente
Asumiría que windows.h define min como una macro, por ejemplo, como
Eso explicaría el mensaje de error.
fuente