标准::numeric_limits::max的语法错误

Syntax error with std::numeric_limits::max

本文关键字:语法 错误 max limits numeric 标准      更新时间:2023-10-16

我有如下类结构定义:

#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];
};

问题是我不能使用'std::numeric_limits::max()',编译器说:

Error 8 error C2059: syntax error : '::'

Error 7 error C2589: '(' : illegal token on right side of '::'

我正在使用的编译器是Visual C++ 11(2012)

您的问题是由包含名为 maxmin 的宏定义的<Windows.h>头文件引起的:

#define max(a,b) (((a) > (b)) ? (a) : (b))

看到这个定义,预处理器替换了表达式中的max标识符:

std::numeric_limits<size_t>::max()

根据宏定义,最终导致语法无效:

std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))

在编译器错误中报告:'(' : illegal token on right side of '::'

作为解决方法,您可以将NOMINMAX定义添加到编译器标志(或在包含标头之前添加到翻译单元):

#define NOMINMAX   

或者用括号将调用包装为 max,这会阻止宏扩展:

size_t maxValue_ = (std::numeric_limits<size_t>::max)()
//                 ^                                ^

或在拨打numeric_limits<size_t>::max()之前#undef max

#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()

正如其他人所说,问题是在<WinDefs.h>(包含在 <windows.h> 中)定义了宏minmax,但如果你会看到它的声明:

// <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 */

您将看到,如果定义了宏NOMINMAXWinDefs.h不会生成这些宏。

这就是为什么最好向项目添加定义NOMINMAX的原因。