Aviso C4003 e erros c2589 e c2059 em: x = std :: numeric_limits :: max ();
-
19-09-2019 - |
Pergunta
Essa linha funciona corretamente em um pequeno programa de teste, mas no programa para o qual eu quero, recebo as seguintes reclamações do compilador:
#include <limits>
x = std::numeric_limits<int>::max();
c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'
Eu recebo os mesmos resultados com:
#include <limits>
using namespace std;
x = numeric_limits<int>::max();
Por que está vendo Max como a macro max (a, b); ?
Solução
Isso geralmente ocorre ao incluir um cabeçalho do Windows que define um min
ou max
macro. Se você está usando cabeçalhos do Windows, coloque #define NOMINMAX
em seu código, ou construir com o interruptor do compilador equivalente (ou seja, use /Dnominmax para Visual Studio).
Observe que o edifício com NOMINMAX
Desativa o uso da macro em todo o seu programa. Se você precisar usar o min
ou max
operações, uso std::min()
ou std::max()
de <algorithm>
cabeçalho.
Outras dicas
Outra solução seria envolver o nome da função com parênteses como este: (std::numeric_limits<int>::max)()
. O mesmo se aplica a std::max
.
Não tenho certeza se é uma boa solução para isso ... Nominmax é melhor IMO, mas isso pode ser uma opção em alguns casos.
Algum outro arquivo de cabeçalho está poluindo o espaço de nome global com uma macro máxima. Você pode corrigir isso invadindo a macro:
#undef max
x = std::numeric_limits<int>::max();
#ifdef max
#pragma push_macro("max")
#undef max
#define _restore_max_
#endif
#include <limits>
//... your stuff that uses limits
#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif
Sua definição para mim no Visual Studio 2013 (formatada para melhor espaçamento ...) é a seguinte:
static _Ty (max)() _THROW0()
{ // return maximum value
return (FLT_MAX);
}
Então, estou apenas usando FLT_MAX. :) Esta pode não ser uma solução universal, mas funciona bem no meu caso, então pensei em compartilhar.
(std :: numeric_limits :: max) ()
Fácil como torta.