std::numeric_limits<double>::min()出现错误C2589

6
当我尝试编译一些代码(不是我的),我得到了一个C2589错误:'(':'::'右侧的非法标记。
在这一行上:
    maxPosition[0]=std::numeric_limits<double>::min();

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

你有 #include <limits> 吗? - matja
尽管这个问题比较老,我已经投票将其作为 https://dev59.com/ZXI-5IYBdhLWcg3wVW3v 的重复关闭,但它可能是一个合并的候选项,因为那里的答案更全面。 - Roger Pate
3个回答

8
因为宏不关心你的命名空间、语言语义或编译器,预处理是首先发生的。换句话说,在预处理阶段之后,编译器只看到剩下的内容。然后,min被替换为某个替换字符串,编译器看到的就是结果。

4

在出错的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 文件顶部添加 #pragma once (就像 WINAPI 一样:参见 Windows.h 示例),在任何 #include 头文件之前,应该可以解决这个问题。

1
这对我来说是最好的答案。 - Val
这应该被标记为正确答案。另外一件事,这确实让我有点疯狂。 - Jamie Nicholl-Shelley
每隔两年左右,我都会回到这个页面……只是为了提醒自己Windows API头文件容易混淆很多宏。 - Mat Gomes

0

在文件顶部添加这个。我很确定这只是 Visual Studio 中链接器工作方式的一个 bug。每当你有一个运算符重载时,你有时会遇到这个问题。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接