Visual studio “宏”;“最大值”;需要2个参数,但只提供1个 模板 结构标量日志最小值{ 公众: 类型定义T值_类型; typedef T result_type; 静止的 结果类型初始值(){ 返回std::log(std::numeric_limits::max()); } 静止的 无效更新(结果类型和t、常量值类型和x){ 如果((x>0)和&(std::log(x)
您在某个地方包含一个头文件,该头文件将Visual studio “宏”;“最大值”;需要2个参数,但只提供1个 模板 结构标量日志最小值{ 公众: 类型定义T值_类型; typedef T result_type; 静止的 结果类型初始值(){ 返回std::log(std::numeric_limits::max()); } 静止的 无效更新(结果类型和t、常量值类型和x){ 如果((x>0)和&(std::log(x),visual-studio,visual-c++,Visual Studio,Visual C++,您在某个地方包含一个头文件,该头文件将#定义smax为宏。最好的解决方案是找出它的定义位置,并尽可能禁止定义它。或者,您可以只#undef它: template <class T> struct scalar_log_minimum { public: typedef T value_type; typedef T result_type; static result_type initial_value(){ retu
#定义smax
为宏。最好的解决方案是找出它的定义位置,并尽可能禁止定义它。或者,您可以只#undef
它:
template <class T>
struct scalar_log_minimum {
public:
typedef T value_type;
typedef T result_type;
static
result_type initial_value(){
return std::log(std::numeric_limits<result_type>::max());
}
static
void update(result_type& t, const value_type& x){
if ( (x>0) && (std::log(x)<t) ) t = std::log(x);
}
};
#包括
#未定义最大值
正如Adam所解释的,这是一个名为max
的宏。另一个解决方案(更多的是“修补程序”)可能是在函数周围加上括号,以防止它被视为宏调用:
#include <evil_header_which_defines_max.h>
#undef max
返回std::log((std::numeric_limits::max)();
我发现,在包含windows.h之后,您会遇到许多定义,这非常令人不安(不仅是max和min,如果我没有弄错的话,我还遇到了其他通用词的问题,如矩形)因此,我养成了只在绝对必要时才包含Windows .h的习惯,而且从不在头文件中使用。这减少了对特定平台的少量C++文件的痛苦。
不幸的是,一些boost库(我相信thread和asio)的头文件中确实包含了windows.h,我仍然时常遇到这种愚蠢的问题
对于其他导致问题的情况,我的解决方案是在包含头文件后取消定义有问题的符号。正如其他人所指出的,包括windows.h
可能是您的问题。Microsoft提供了一种“关闭”的方法带有预处理器符号的windows.h
部分。您可以将这些符号定义为构建的一部分,也可以直接在代码中定义
使用预处理器符号有条件地跳过windows.h的部分可能被认为是优雅的,也可能不被认为是优雅的,但在一般情况下,它比#undef
更简单、更通用、更可扩展
下面介绍如何跳过将min
或max
定义为宏:
return std::log((std::numeric_limits<result_type>::max)());
#定义NOMINMAX
#包括
请注意,许多include文件在某些情况下会包含windows.h
。在这种情况下,在更全局的级别上设置定义可能更方便
如果你在windows.h
中搜索,你会发现一些其他的预处理器符号(例如,NOOPENFILE
,NOKANJI
,NOKERNEL
和许多其他符号),这些符号通常是有用的。59是列号吗?我在MSVC中也有类似的问题,我想它们的库头中也有。windef.h(通常通过windows.h包含)包含这样一个令人不快的定义,并且经常给STL用户带来麻烦。
#define NOMINMAX
#include <windows.h>