【问题标题】:Error C2589 on std::numeric_limits<double>::min()std::numeric_limits<double>::min() 上的错误 C2589
【发布时间】:2009-12-01 12:29:23
【问题描述】:

当我尝试编译一些代码(不是我自己的)时,我得到一个 C2589 '(':illegal token on the right side of'::'

在这一行:

    maxPosition[0]=std::numeric_limits<double>::min();

我猜这是因为已经定义了一个 min() 宏,但是为什么编译器没有从指定的命名空间而不是宏中获取 min() 呢?

【问题讨论】:

标签: c++ visual-c++ macros compiler-errors


【解决方案1】:

但是为什么编译器没有从指定的命名空间而不是宏中获取 min() 呢?

因为宏不关心您的命名空间、语言语义或编译器。预处理发生首先

换句话说,编译器只看到预处理阶段之后剩下的内容。而min 被替换成一些替换字符串,结果就是编译器看到的。

【讨论】:

    【解决方案2】:

    在有问题的 std::numeric_limits::min() 函数上按 F12

    导致一些喜欢的地方:

    c:\Program Files (x86)\Windows Kits\8.1\Include\shared\minwindef.h

    你会在哪里找到:

    #ifndef NOMINMAX
    
    #ifndef max
    #define max(a,b)            (((a) > (b)) ? (a) : (b))
    #endif
    
    #ifndef min
    #define min(a,b)            (((a) < (b)) ? (a) : (b))
    #endif
    

    所以添加

    #define NOMINMAX
    

    到您的 .cpp 文件顶部(如 WINAPI 所做的那样:参见 Windows.h 作为示例),然后任何 #include 标头都应该纠正问题。

    【讨论】:

    • 这对我来说是最好的答案。
    • 这应该被标记为正确答案。顺便说一句,这确实让我有点发疯了。
    • 每隔两年左右我就会回到这个页面...只是提醒一下,Windows api 标头污染了很多宏。
    【解决方案3】:

    将此添加到文件的顶部。我很确定这只是链接器在 Visual Studio 中工作方式的一个错误。有时,只要您有运算符重载,您就会得到这个。

    using namespace std;
    

    在我的情况下这是可行的

     for (int i = min(size_used_, other.size_used_) - 1; i >= 0; --i) {
      result += data_[i] * other.data_[i];
    }
    

    如果不是这样

     for (int i = std::min(size_used_, other.size_used_) - 1; i >= 0; --i) {
      result += data_[i] * other.data_[i];
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 2015-02-11
      • 2018-07-20
      • 2018-06-16
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多