www whatwg standard language 3wc c++ visual-studio-2005

c++ - whatwg - w3c html standards



std:: min da error (10)

#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 : ''::''


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 el encabezado, esta es generalmente una mala técnica de definición de macros para afectar los siguientes encabezados;

2) defina 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.


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

Debería #define NOMINMAX antes de incluirlo.


En mi caso, el proyecto no incluía windows.h windef.h explícitamente. Estaba usando Boost. Por lo tanto, resolví el problema yendo al proyecto Properties -> C/C++ -> Preprocessor y anexando NOMINMAX en las Preprocessor Definitions del Preprocessor Definitions (VS 2013, VS 2015).


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);


Para las personas, incluido windows.h, ponga lo siguiente en los encabezados afectados:

#include windows headers ... pragma push_macro("min") pragma push_macro("max") #undef min #undef max #include headers expecting std::min/std::max ... ... pragma pop_macro("min") pragma pop_macro("max")

En los archivos fuente solo #undef min y max.

#include windows headers ... #undef min #undef max #include headers expecting std::min/std::max ...


Para resolver este problema, solo creo un archivo de encabezado llamado fix_minmax.h sin incluir guardias

#ifdef max #undef max #endif #ifdef min #undef min #endif #ifdef MAX #undef MAX #endif #define MAX max #ifdef MIN #undef MIN #endif #define MIN min #include <algorithm> using std::max; using std::min;

El uso básico es así.

// Annoying third party header with min/max macros #include "microsoft-mega-api.h" #include "fix_minmax.h"

Las ventajas de este enfoque es que funciona con todo tipo de archivo incluido o parte del código. Esto también le ahorra tiempo cuando trabaja con código o bibliotecas que dependen de macros min / max


Pruebe algo como esto:

#define NOMINMAX #include <windows.h>

Por defecto, windows.h define min y max como macros. Cuando se expanden, el 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 le dice que std::(x) no está permitido.


Supongo que windows.h define min como una macro, por ejemplo, como

#define min(a,b) ((a < b) ? a : b)

Eso explicaría el mensaje de error.


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 impide que el preprocesador coincida con el min y es posiblemente más legible que la solución de paréntesis.