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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top