宏“max”需要2个参数,但只有1个参数

时间:2009-02-05 23:46:21

标签: visual-studio visual-c++

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);
    }
};

我在尝试编译上面时遇到以下错误:

functional_ext.hpp:55:59:宏“max”需要2个参数,但只有1个

max不是宏,对吗?那么这个错误是什么?顺便说一句,我正在使用visual studio 2005

另外55:59 --- 55是第59行?

4 个答案:

答案 0 :(得分:7)

您在#define s max作为宏的位置包含了一个头文件。最好的解决方案是弄清楚它的定义位置,并在可能的情况下禁止定义它。或者,您可以#undef

#include <evil_header_which_defines_max.h>
#undef max

答案 1 :(得分:5)

我发现你在windows.h中遇到的很多#defines非常令人不安(不仅是max和min,而且如果我没弄错的话,我也会遇到像Rectangle这样的其他通用词的问题)。因此,我已经养成了只在绝对必要时才包含windows.h的习惯,而且从不在头文件中。这减少了少数特定于平台的C ++文件的痛苦。

不幸的是,有些boost库(我相信thread和asio)在它们的标题中包含了windows.h,而且我还是经常遇到这种愚蠢的问题。

对于导致问题的其余情况,我的解决方案是在包含头文件后#undef有问题的符号。

答案 2 :(得分:3)

正如其他人所说,包括windows.h可能是你的问题。 Microsoft提供了一种使用预处理程序符号“关闭”windows.h部分的方法。您可以将这些符号定义为构建的一部分,也可以直接在代码中定义。

使用预处理程序符号有条件地跳过windows.h的部分可能会或可能不会被认为是优雅的,但在一般情况下,它比#undef更容易,更通用,更具伸缩性。

以下是如何跳过将minmax定义为宏的方法:

#define NOMINMAX
#include <windows.h>

请注意,许多包含文件在某些​​时候会包含windows.h。在这种情况下,在更全局的级别设置定义可能更方便。

如果您搜索windows.h,您可以找到许多其他预处理器符号(例如,NOOPENFILENOKANJINOKERNEL以及许多其他符号)是有用的。

答案 3 :(得分:1)

这是一个名为max的宏,正如亚当解释的那样。另一个解决方案(更多的是“修补程序”)可能是在函数周围放置括号,以防止它被视为宏调用:

return std::log((std::numeric_limits<result_type>::max)());