为什么numeric_limits <t> :: min被编译器解释为函数指针?

时间:2015-10-02 18:34:52

标签: c++ g++

我正在使用模板编写浮点比较函数:

template<class T>
    static bool AlmostEqual(T f1, T f2) 

我的声明如下:

T min_value = std::numeric_limits<T>::min();

由于某种原因,编译器将上面的min视为函数指针并发出错误:

   ../include/CommonFunctions.h: In static member function ‘static bool CommonFunctions::AlmostEqual(T, T) [with T = double]’:
file.cpp:2200:   instantiated from here
../include/CommonFunctions.h:22: error: cannot convert ‘double (*)()throw ()’ to ‘double’ in initialization

静态函数被定义为大程序的一部分。但是,当我将相同的函数放在一个独立的文件中并编译和使用它时,我看到没有错误。我读了其他帖子并试过这样的话:

T min_value(std::numeric_limits<T>::min());

我仍然得到同样的错误,还有一个错误:

../include/CommonFunctions.h:22:53: error: macro "min" requires 2 arguments, but only 1 given

在一个错误中,它能够正确地将min解析为函数,而在另一个错误中,它被视为宏。我不确定,如何解决这个问题。任何指针都会受到赞赏吗?

1 个答案:

答案 0 :(得分:3)

对于包括windows.h的人,请将以下内容放在有效的标题中:

#include windows headers ...

pragma push_macro("min")
pragma push_macro("max")
#undef min
#undef max

#include headers expecting std::min/std::max ...

...

pragma pop_macro("min")
pragma pop_macro("max")

在源文件中只有#undef min和max。

#include windows headers ...

#undef min
#undef max

#include headers expecting std::min/std::max ...