非法令牌右侧::

我有以下模板声明:

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())”的行上抛出非法令牌错误。 我从一些旧的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行是前面提到的行。

我的猜测是, max已经成为一个macros。 这发生在windows.h中的某个地方。

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

编辑:

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

您也可以通过以下方法防止macros扩展: (std::numeric_limits<T>::max)()


在一个侧面说明,为什么不做std::numeric_limits<T>::min()而不是否定max?

看起来你需要:

#include <limits>

我写了一个包含你的方法声明的简单结构的“testing工具”,并且包含了<limits><vector> ,并且调用(并且实例化了) Tint的方法,很好,在Windows Vista上的Visual Studio 2008 Express和在Linux 2.6上的GCC 4.2.4都是如此。

我build议试着只用最less的代码来构build“问题”,如果实际上构build了代码,那么在项目的其余部分添加回来,直到它破坏为止,然后你就会知道是什么原因造成的。