c ++-::右侧的非法令牌

我有以下模板声明:

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;

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

编辑:使用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

216行是前面提到的行。

Adam Haile asked 2020-02-13T20:07:41Z
3个解决方案
115 votes

我的猜测是<limits>已成为宏。 这发生在#undef max内部的某个点。

在包括在内之前,请定义<limits>,以阻止#undef max执行此操作。

编辑:

我仍然相信这是您的问题。 (不包括<limits>将导致不同的错误)。 在功能之前放置#undef max#undef min,然后重试。 如果可以解决问题,那是正确的,并且您的std::numeric_limits<T>::min()的定义不正确。 (将其添加为项目设置。)

您还可以通过以下方法阻止宏扩展:std::numeric_limits<T>::min()


附带说明一下,为什么不这样做std::numeric_limits<T>::min(),而不要忽略最大值?

GManNickG answered 2020-02-13T20:08:20Z
2 votes

看来您需要:

#include <limits>

John Dibling answered 2020-02-13T20:08:46Z
0 votes

我编写了一个“测试工具”,其中包含一个简单的结构,其中包含您的方法声明(没有其他内容),并#include <limits><vector>,然后调用(并实例化)该方法,其中Tint,并且编译就很好了 Windows Vista上的Visual Studio 2008 Express以及Linux 2.6上的GCC 4.2.4。

我建议尝试只构建包含“问题”的最少代码,如果确实存在,请在项目的其余部分重新添加,直到它崩溃为止,然后您才知道是什么原因造成的。

John Zwinck answered 2020-02-13T20:09:11Z
translate from https://stackoverflow.com:/questions/2561368/illegal-token-on-right-side-of