首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::numeric_limits::max的语法错误

std::numeric_limits::max的语法错误
EN

Stack Overflow用户
提问于 2014-12-12 19:40:11
回答 2查看 21.5K关注 0票数 49

我有如下的类结构定义:

代码语言:javascript
复制
#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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-12 19:58:39

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

代码语言:javascript
复制
#define max(a,b) (((a) > (b)) ? (a) : (b))

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

代码语言:javascript
复制
std::numeric_limits<size_t>::max()

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

代码语言:javascript
复制
std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))

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

作为一种解决方法,您可以将NOMINMAX定义添加到编译器标志(或添加到转换单元,然后再包括标头):

代码语言:javascript
复制
#define NOMINMAX   

或者将对max的调用用括号括起来,这样可以防止宏的扩展:

代码语言:javascript
复制
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
//                 ^                                ^

或在调用numeric_limits<size_t>::max()之前使用#undef max

代码语言:javascript
复制
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
票数 113
EN

Stack Overflow用户

发布于 2014-12-12 20:29:42

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

代码语言:javascript
复制
// <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 */

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

这就是为什么在项目中添加一个定义NOMINMAX会更好。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27442885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档