J'ai la définition de structure de classe comme suit:
#include <limits>
struct heapStatsFilters
{
heapStatsFilters(size_t minValue_ = 0, size_t maxValue_ = std::numeric_limits<size_t>::max())
{
minMax[0] = minValue_; minMax[1] = maxValue_;
}
size_t minMax[2];
};
Le problème est que je ne peux pas utiliser 'std :: numeric_limits :: max ()' et le compilateur dit:
Error 8 error C2059: syntax error : '::'
Error 7 error C2589: '(' : illegal token on right side of '::'
Le compilateur que j'utilise est Visual C++ 11 (2012)
Votre problème est dû au fichier d'en-tête <Windows.h>
Qui inclut des définitions de macro nommées max
et min
:
#define max(a,b) (((a) > (b)) ? (a) : (b))
En voyant cette définition, le préprocesseur remplace l'identifiant max
dans l'expression:
std::numeric_limits<size_t>::max()
par la définition de la macro, conduisant finalement à une syntaxe non valide:
std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))
signalé dans l'erreur du compilateur: '(' : illegal token on right side of '::'
.
Comme solution de contournement, vous pouvez ajouter la définition de NOMINMAX
aux indicateurs du compilateur (ou à l'unité de traduction, avant d'inclure l'en-tête):
#define NOMINMAX
ou encapsulez l'appel à max
avec des parenthèses, ce qui empêche l'expansion de la macro:
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
// ^ ^
ou #undef max
avant d'appeler numeric_limits<size_t>::max()
:
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
Comme d'autres le disent, le problème est qu'en <WinDefs.h>
(inclus par <windows.h>
) est défini macroses min
et max
, mais si vous voyez sa déclaration:
// <WinDefs.h>
#ifndef NOMINMAX
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#endif /* NOMINMAX */
vous verrez que si une macro est définie NOMINMAX
alors WinDefs.h
ne produira pas ces macroses.
C'est pourquoi il serait préférable d'ajouter un définir NOMINMAX
au projet.