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

您在某个地方包含一个头文件,该头文件将
#定义
s
max
为宏。最好的解决方案是找出它的定义位置,并尽可能禁止定义它。或者,您可以只
#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>