::右侧的非法令牌::

Ada*_*ile 48 c++ linux winapi

我有以下模板声明:

template <typename T>
   void IterTable(int&                       rIdx,
                  std::vector<double>&       rVarVector,
                  const std::vector<T>&      aTable,
                  const T                    aValue,
                  T              aLowerBound = -(std::numeric_limits<T>::max()), //illegal token on right side of '::' shows here
                  bool                       aLeftOpen = true) const;
Run Code Online (Sandbox Code Playgroud)

如上所述,在" - (std :: numeric_limits :: max())"行上抛出非法令牌错误.我从一些旧的Linux源代码中获得了这个代码,我正在尝试在Windows上编译.知道问题是什么吗?

编辑:使用min()也失败,编译器输出为:

Error   92  error C2589: '::' : illegal token on right side of '::' c:\projects\r&d\prepaydll\include\cfcdefault.h  216 PrepayDLL

Error   93  error C2059: syntax error : '::'    c:\projects\r&d\prepaydll\include\cfcdefault.h  216 PrepayDLL
Run Code Online (Sandbox Code Playgroud)

线216是前面提到的线.

GMa*_*ckG 116

我的猜测是max做了一个宏.这发生在内部的某些方面windows.h.

NOMINMAX在包括停止windows.h这样做之前定义.

编辑:

我仍然相信这是你的问题.(不包括<limits>会导致不同的错误).将#undef max#undef min刚刚函数之前,然后再试一次.如果它修复它,我是正确的,你NOMINMAX没有正确定义.(将其添加为项目设置.)

您还可以防止宏展开的:(std::numeric_limits<T>::max)().


在旁注,为什么不做std::numeric_limits<T>::min()而不是否定最大值?

  • 或者,如果由于某种原因无法使用`NOMINMAX`,则可以通过括起函数名来阻止宏扩展:`(std :: numeric_limits <T> :: max)()`.这非常非常难看,但在某些情况下可能是必要的. (5认同)
  • 对于二进制补码整数(几乎所有你得到的),最小值比最大值的否定值小1.所以,我同意你的旁注:为什么否定最大值? (3认同)
  • (std :: numeric_limits <T> :: max)()对我很有用.一个非常方便的帖子! (3认同)
  • 令人震惊的是,windows.h定义的最大/最小麻烦多少。 (2认同)

Joh*_*ing 5

看起来您需要:

#include <limits>