非法令牌右侧::
我有以下模板声明:
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>
,并且调用(并且实例化了) T
为int
的方法,很好,在Windows Vista上的Visual Studio 2008 Express和在Linux 2.6上的GCC 4.2.4都是如此。
我build议试着只用最less的代码来构build“问题”,如果实际上构build了代码,那么在项目的其余部分添加回来,直到它破坏为止,然后你就会知道是什么原因造成的。