Pregunta std :: min da error


#include <algorithm>
#include <Windows.h>

int main()
{
    int k = std::min(3, 4);
    return 0;
}

¿Qué está haciendo 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 : '::'

75
2018-02-15 14:26


origen


Respuestas:


los windows.h archivo de encabezado (o más correctamente, windef.h que incluye a su vez) tiene macros para min y max que están interfiriendo.

Debieras #define NOMINMAX antes de incluirlo


115
2018-02-15 14:28



No es necesario definir nada, simplemente omita la macro con esta sintaxis:

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);

66
2018-02-25 18:34



Como otros mencionaron, los errores se deben a las macros min / max que se definen en los encabezados de Windows. Hay tres formas de desactivarlos.

1) #define NOMINMAX antes de incluir encabezado, esta es generalmente una mala técnica de definición de macros para afectar los siguientes encabezados;

2) definir NOMINMAX en la línea de comandos del compilador / IDE. Lo malo de esta decisión es que si desea enviar sus fuentes, debe advertir a los usuarios que hagan lo mismo;

3) simplemente defina las macros en su código antes de que se utilicen

#undef min
#undef max

Esta es probablemente la solución más portátil y flexible.


22
2018-02-15 14:56



Pruebe algo como esto:

#define NOMINMAX
#include <windows.h>

Por defecto, windows.h define min y max como macros. Cuando se expanden, código que intenta usar std::min (por ejemplo) terminará luciendo algo como esto:

int k = std::(x) < (y) ? (x) : (y);

El mensaje de error te está diciendo que std::(x) no está permitido


11
2018-02-15 14:29



Todavía tengo problemas ocasionalmente con los encabezados de Windows y la definición de todo el proyecto de NOMINMAX no siempre parece funcionar. Como alternativa al uso de paréntesis, a veces hago que el tipo sea explícito como ese:

int k = std::min<int>(3, 4);

Esto también detiene al preprocesador para que no coincida min y es posiblemente más legible que la solución de paréntesis.


10
2018-06-18 20:06



En mi caso, el proyecto no incluyó windows.h o windef.h explícitamente. Estaba usando Boost. Entonces, resolví el problema yendo al proyecto Properties -> C/C++ -> Preprocessory anexando NOMINMAX en el Preprocessor Definitions (VS 2013, VS 2015).


3
2017-11-22 19:00



#define NOMINMAX

es el truco para suprimir las definiciones macro de max y min

http://support.microsoft.com/kb/143208


2
2018-02-15 14:30