【问题标题】:Why can't compare int and size_t in c++为什么不能在 C++ 中比较 int 和 size_t
【发布时间】:2022-01-13 02:32:52
【问题描述】:

问题是,如果我在 for 循环中比较 int 和 size_t 效果很好。

vector<int> v;
for (int i = 0; i < v.size(); ++i)

但是,如果我这样做,它将不起作用:

vector<int> v;
int max_num = max(3, v.size());
Line 13: Char 24: error: no matching function for call to 'max'

/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:370:5: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('int' vs. 'unsigned long')
    max(const _Tp&, const _Tp&);
    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_algo.h:3462:5: note: candidate template ignored: could not match 'initializer_list<type-parameter-0-0>' against 'int'
    max(initializer_list<_Tp> __l, _Compare __comp)
    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_algo.h:3456:5: note: candidate function template not viable: requires single argument '__l', but 2 arguments were provided
    max(initializer_list<_Tp> __l)
    ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:375:5: note: candidate function template not viable: requires 3 arguments, but 2 were provided
    max(const _Tp&, const _Tp&, _Compare);
    ^
1 error generated.

在最底层的情况下,我必须将 size_t 转换为 int 才能正常工作。

为什么在 for 循环中我不需要这样做?只是好奇。

【问题讨论】:

    标签: c++ integer


    【解决方案1】:

    在 C++ 中,当二元运算符的类型不同时,有各种(复杂的)规则来控制二元运算符使用的实际类型:

    i < v.size()
    

    其中一个是int。另一个是size_t。没关系,有一些规则可以确定用于比较的实际类型(int 值类型转换为size_t,然后&lt; 运算符进行比较。

    max(3, v.size());
    

    std::max 的定义在功能上要求它的两个参数是同一类型。他们不是。因此编译错误。

    既然您了解了原因,请尝试重新阅读以下错误消息,看看您现在是否理解编译器告诉您的确切信息:

    推断出参数“_Tp”的冲突类型(“int”与“unsigned long”)max(const _Tp&, const _Tp&);

    正如您在此处看到的,编译器正在努力消化具有两个参数的函数,这两个参数都是同一类型:const _Tp &amp;max() 的定义是这样写的:它的两个参数都是同一类型。

    好吧,可怜的编译器看到其中一个参数是int,另一个是size_t(又名“unsigned long”)并放弃了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 2016-10-22
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2022-01-24
      • 2012-06-10
      相关资源
      最近更新 更多