右边的非法标记:

我有以下模板声明:

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 _ limit: : 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

第216行,就是前面提到的那行。

52885 次浏览

我猜想 max已经被做成了一个宏,这发生在 windows.h内部的某个点上。

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

编辑:

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

还可以通过以下方法防止宏展开: (std::numeric_limits<T>::max)()


顺便说一句,为什么不做 std::numeric_limits<T>::min()而不是取消最大值?

看起来你需要:

#include <limits>

我编写了一个“测试工具”,其中包含一个包含方法声明的简单结构(没有其他内容) ,# 包含 <limits><vector>,并调用(从而实例化) Tint的方法,它在 Windows Vista 上的 Visual Studio 2008 Express 和 Linux 2.6上的 GCC 4.2.4上都编译得很好。

我建议尽量只构建含有“问题”的最少量代码,如果确实构建了代码,那么就在项目的其余部分中添加代码,直到出现故障,然后您就会知道是什么导致了故障。