0

我今天遇到了这个奇怪的错误,我使用 std::min 来获取变量值和枚举常量的最小值,到目前为止,很好,但是当我去编译它时,g++ 给了我一个编译错误指示它找不到与 min 函数匹配的模板:

no matching function for call to ‘min(int&, main()::<anonymous enum>)’

这是一个重现错误的最小示例:

#include <algorithm>
int main()
{
    int actualRange=10;
    enum { DesiredRange=8 };
    int workingRange = std::min(actualRange, DesiredRange);
    return 0;
}

修复很简单,我简单地将int(DesiredRange)其用作 min 函数的第二个参数,但令我惊讶的是,这是必要的,因为枚举类型只是一个整数常量。我的系统信息如下:“g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3”

我的代码中有什么不正确的地方导致了这个错误吗?这是一个有效的编译错误吗?

4

2 回答 2

3

你的代码没问题。模板参数推导不进行转换(除了派生到基地),因此您使用简单定义的函数(例如std::min. andrei alexandrescu 曾经写过一篇长篇论文,讲述了在 C++03 中需要什么来使基于模板的min函数像宏一样类型宽松。

于 2013-04-08T19:54:26.367 回答
2

您忘记的是std::min仅在一种类型上进行模板化,并且当您将两种不同的类型(您的枚举和 int)传递给它时,编译器无法确定要使用两种类型中的哪一种以及模板类型,因此类型推断失败并出现错误。

您可以指定std::min<int>(actualRange, DesiredRange);您是否发现它比您的 int 强制转换机制更清晰。

于 2013-04-08T20:06:30.047 回答