【问题标题】:std::max - expected an identifierstd::max - 需要一个标识符
【发布时间】:2011-08-12 02:26:44
【问题描述】:

std::max 有问题。我想不通。

int border = 35;
int myInt = 2;
int myOtherInt = 3;
int z = std::max(myInt + 2 * border, myOtherInt + 2 * border);

我已包含算法标准标头。当我将鼠标悬停在 max 上时,我得到:

错误:需要一个标识符

还有一个编译错误:

错误 C2589:'(''::' 右侧的非法令牌
错误 C2059:语法错误:'::'

怎么了?

【问题讨论】:

  • 你加入了<algorithm>吗?你包括<windows.h>吗?
  • OP sez:“我已经包含了算法标准头。”
  • 您能否提供一个我们可以尝试编译的完整示例?你的程序足够短。
  • 不相关,但如果你写std::max(myInt, myOtherInt) + 2 * border;,它似乎会更短更容易阅读

标签: c++


【解决方案1】:

冒昧猜测,因为您使用的是 VC++ - 将其放在任何 #includes 之前:

#define NOMINMAX

windows.h 定义名为 minmax 的宏,如下所示:

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

在 C++ 标准化之前,Windows SDK 就包含了这些宏,但由于它们显然会对 C++ 标准库造成严重破坏,因此可以定义 NOMINMAX 宏来防止它们被定义。

通常,如果您使用 C++(而不是 C)并包括 windows.h总是首先定义 NOMINMAX

【讨论】:

  • 当我添加它时它看起来像编译。但为什么?这是一个错误吗?
  • @Jay:显然是&lt;windows.h&gt; 本身通过定义名为minmax 的宏来搞砸一切。恭喜微软!更多here.
  • 感谢您的解释。按照我的理解,Windows.h 定义了这些宏。然后在 C++ 标准库的某个位置,在命名空间 std 中,定义了函数模板 T max(const T& x, const T& y)。因此,当涉及到这一行时,对 max 宏和通用函数 max 存在混淆。唯一奇怪的是,如果我不包含 Windows.h(因此不应该发生冲突),我仍然无法使用 std::max。
  • 也许其他标准头文件包括 Windows.h,因为我的头文件都不是!
  • @Jay :如果您使用 MFC 或任何其他 GUI 框架,那么 windows.h 将始终包含在某处。
【解决方案2】:

如果您使用的是 VC++,您可以在包含任何标头之前使用 #define NOMINMAX,或者使用 (std::max)(myInt + 2 * border, myOtherInt + 2 * border)

【讨论】:

  • 哇,这太棒了!正是我想要的。我试图使用std::numeric_limits&lt;uint32_t&gt;::max() 而愚蠢的windows.h 导致预处理器插入std::max() 代替max()。只需执行(std::numeric_limits&lt;uint32_t&gt;::max)() 就足以让预处理器避免做错事。我不想做 NOMINMAX 的事情,因为我担心 windows.h 在定义之前可能会被包含,更不用说我自己的很多文件都包含 windows.h。谢谢!
【解决方案3】:

我会说max#define 的其他东西,或者您需要通过std::max&lt;int&gt; 显式调用模板。

【讨论】:

    【解决方案4】:

    “使用”声明(参见using Declaration)是解决此问题的另一种方法:

    int border = 35;
    int myInt = 2;
    int myOtherInt = 3;
    using std::max;
    int z = max(myInt + 2 * border, myOtherInt + 2 * border);
    

    它允许在没有明确限定的情况下使用 std::max。

    【讨论】:

      【解决方案5】:

      您是否尝试过改用::std::max?如果这不起作用,则说明您的 std 命名空间有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多