C++ 右侧的非法令牌::
我有以下模板声明:C++ 右侧的非法令牌::,c++,linux,winapi,C++,Linux,Winapi,我有以下模板声明: template <typename T> void IterTable(int& rIdx, std::vector<double>& rVarVector, const std::vector<T>& aTable, const T
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;
第216行,就是前面提到的那一行。我猜
max
已经变成了一个宏。这发生在windows.h
内部的某个点上
在包含之前定义NOMINMAX
,以停止windows.h
编辑:
我仍然相信这是你的问题。(不包括
将导致不同的错误)。将#undef max
和#undef min
放在函数前面,然后重试。如果这解决了它,我是正确的,并且您的NOMINMAX
没有被正确定义。(将其添加为项目设置。)
还可以通过以下方法防止宏扩展:(std::numeric\u limits::max)(
)
另一方面,为什么不执行std::numeric\u limits::min()而不是对最大值求反?看起来您需要:
#include
我编写了一个“测试工具”,其中包含一个简单的结构,其中包含了您的方法声明(以及其他内容),并且#include
和
,并调用(并因此实例化)了T
为int
的方法,并且编译得很好,Windows Vista上的Visual Studio 2008 Express和Linux 2.6上的GCC 4.2.4
我建议尝试只构建少量包含“问题”的代码,如果确实构建了问题,请将其添加到项目的其余部分,直到问题出现,然后您就会知道问题的原因。对我来说很有效。你有
#包含?如果编译器告诉我们这个令牌是什么,那将非常有用。在某些方面,现代C++编译器仍然很糟糕。(并且这种错误消息不限于一个编译器。)尝试保存/查看预处理器输出。(/E或/P)。是否已检查是否包含
?无需包含任何限制库或无需定义NOMINMAX。请参阅此处的解决方案:只需在(std::max)或(std::min)中添加括号,或者,如果出于某种原因无法使用NOMINMAX
,可以通过将函数名插入括号来防止宏扩展:(std::numeric_limits::max)(
)。这是非常非常难看的,但在某些情况下可能是必要的。对于两个补码整数(这几乎是你所能得到的),最小值比最大值的反值小一个。所以,我同意你的观点:为什么要否定最大值?这个(std::numeric_limits::max)对我来说很好。一个非常方便的帖子!windows.h对max/min的定义造成了多大的麻烦,真是令人震惊。@danelliottster。因为一个愚蠢的小写定义,我不能使用标准库函数。这是正确的答案,它解决了构建问题。
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