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.
#define NOMINMAX
es el truco para suprimir las definiciones macro de max y min