std::numeric_limits 出错

not enough actual parameters for macro 'max'  for std::numeric_limits<size_t>

如果在程序中同时导入limits.h和windows.h,并使用numeric_limits::max()或numeric_limits::min()就会发生编译错误:

  1. --------------------Configuration: MultiInGF8 - Win32 Debug--------------------  
  2. Compiling...  
  3. main.cpp  
  4. F:\software\VC\Microsoft Visual Studio\MyProjects\MultiInGF8\main.cpp(103) : warning C4003: not enough actual parameters for macro 'max'  
  5. F:\software\VC\Microsoft Visual Studio\MyProjects\MultiInGF8\main.cpp(103) : error C2589: '(' : illegal token on right side of '::'  
  6. F:\software\VC\Microsoft Visual Studio\MyProjects\MultiInGF8\main.cpp(103) : error C2143: syntax error : missing ')' before '::'  
  7. F:\software\VC\Microsoft Visual Studio\MyProjects\MultiInGF8\main.cpp(103) : error C2059: syntax error : ')'  
  8. 执行 cl.exe 时出错.  
  9.   
  10. main.obj - 1 error(s), 0 warning(s)  

本来想用numeric_limits::max()来清空输入缓冲区,从而处理输入出错的异常情况:

  1. cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); // 清除输入缓冲区中的当前行内容  

另一方面,又要对程序进行计时,于是导入了windows.h:

  1. #include <limits> // numeric_limits  
  2. #include <windows.h>  

结果发生了冲突,即以上的编译错误。

幸好【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题该文章给出了解决方法。

问题应该是以上两个头文件的宏定义出现了冲突,可以通过括号“()”来避免预编译器报错。

也就是改成这样:

于是,上述语句改为

  1. cin.ignore((numeric_limits<std::streamsize>::max)(),'\n'); // 清除输入缓冲区中的当前行内容  


这样就不会发生冲突问题了。


std::numeric_limits::max()问题,请大虾帮忙

09-17

我有这样一个模板类: rn rn#include rn#include rn rnusing namespace std; rn rntemplate rnclass HandleManager rn rnpublic: rn HandleManager(T); rn HandleManager(T, size_t); rn T provide(); rn void free(T); rn rnprivate: rn size_t maximum ; rn T highest ; rn std::list available ; rn; rn rn/** Constructor. The default maximal value will be based on the type max. rn@param init Initial handle value (use for first requested handle) rn*/ rntemplate rnHandleManager::HandleManager(T init) rn: highest(init) //,maximum(std::numeric_limits::max()) //注释掉 rn rn maximum = std::numeric_limits::max(); rn rn rn// ============================================================================ rn/** Constructor rn @param init Initial handle value (use for first requested handle) rn @param hmax Maximal handle value rn */ rntemplate rnHandleManager::HandleManager(T init, size_t hmax) rn: highest(init), maximum(hmax) rn rn// ---------------------------------------------------------------------------- rn/** Get a new handle rn @return handle rn @throw RTIinternalError if all handles between first and maximal are used rn */ rntemplate T rnHandleManager::provide() rn rn T handle = 0 ; rn rn if (available.size() > 0) rn handle = available.front(); rn available.pop_front(); rn rn else rn if (highest < maximum) rn handle = highest++ ; rn rn rn return handle ; rn rn rn// ---------------------------------------------------------------------------- rn/** Free a handle rn @pre handle is a previously-provided handle rn @param handle Handle to free rn */ rntemplate void rnHandleManager::free(T handle) rn rn if (handle + 1 == highest) rn --highest ; rn else rn available.push_back(handle); rn rn rn rn rn rn然后在一个类里调用 HandleManager MyHandle; rn rn但编译时出现: rnwarning C4003: “max”宏的实参不足 rnerror C2589: “(” : “::”右边的非法标记 rnD:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xmemory(156) : 编译类模板成员函数“open::HandleManager::HandleManager(T)”时 rn with rn [ rn T=open::Handle rn ] rn e:\工作空间\open source\RootObject.h(77) : 参见对正在编译的类模板实例化“open::HandleManager”的引用 rn with rn [ rn T=open::Handle rn ] rn rn错误发生在maximum = std::numeric_limits::max(); 语句中,请问这是什么原因 ?

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试