【问题标题】:Syntax error with std::numeric_limits::maxstd::numeric_limits::max 的语法错误
【发布时间】:2015-02-11 02:52:01
【问题描述】:

我的类结构定义如下:

#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)

【问题讨论】:

  • 无法复制。尝试包括&lt;cstddef&gt;
  • @ParkYoung-Bae 我没有在我的代码中使用 std 作为 size_t 。我应该这样做吗?
  • @remyabel 您使用的是哪个编译器?我正在使用 Visual C++ 11 (2012)
  • 检查您是否有#define max(a,b) 或类似的地方,或在struct ifxHeapStatsFilters 之前添加#undef max 以检查是否是这里的问题
  • @PiotrS。是的!你说的对!有效! :)

标签: c++ visual-c++ syntax syntax-error numeric-limits


【解决方案1】:

您的问题是由包含名为maxmin 的宏定义的&lt;Windows.h&gt; 头文件引起的:

#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)()
//                 ^                                ^

#undef max 之前调用numeric_limits&lt;size_t&gt;::max()

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

【讨论】:

  • 警告:定义 NOMINMAX 可能会导致新的麻烦,因为许多其他 Windows 标头都需要/使用/预期最小/最大宏...
  • > 对我来说非常有用,谢谢!
【解决方案2】:

正如其他人所说,问题在于&lt;WinDefs.h&gt;(包含在&lt;windows.h&gt;)中定义了宏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 */

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多