【问题标题】:Error: "couldn't infer template argument '_Tp' " when passing in {} into错误:“无法推断模板参数 '_Tp'” 将 {} 传入
【发布时间】:2021-05-10 16:46:01
【问题描述】:
struct compar {
  bool operator()(const vector<int>& a,
                  const vector<int>& b) const {
    return a[1] < b[1];
  }
};

...

auto it = lower_bound(events.begin(), events.end(), {0, events[i][0]}, compar());

这段代码给了我一个关于 {0, events[i][0]} 的错误:

/bits/stl_algo.h:2022:5: note: candidate template ignored: couldn't infer template argument '_Tp'
    lower_bound(_ForwardIterator __first, _ForwardIterator __last,
    ^

/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/algorithmfwd.h:353:5: note: candidate function template not viable: requires 3 arguments, but 4 were provided
    lower_bound(_FIter, _FIter, const _Tp&);
    ^
1 error generated.

但是当我将它明确定义为向量时,它会按预期工作。

vector<int> point = {0, events[i][0]};
      auto it = lower_bound(events.begin(), events.end(), point, compar());

谁能解释一下原因?

【问题讨论】:

    标签: c++ templates compiler-errors template-argument-deduction braced-init-list


    【解决方案1】:

    Braced-init-list 本身没有类型,不能用于模板参数的推导。这是non-deduced context

    在以下情况下,用于构成 P 的类型、模板和非类型值不参与模板参数推导,而是使用在其他地方推导或显式指定的模板参数。如果模板参数仅在非推导上下文中使用且未显式指定,则模板参数推导失败。

    1. 参数 P,其 A 是一个花括号初始化列表,但 P 不是 std::initializer_list、对一个的引用(可能是 cv 限定的)或对数组的引用:

    如您所见,您必须明确指定类型,例如

    auto it = lower_bound(events.begin(), events.end(), vector<int>{0, events[i][0]}, compar());
    //                                                  ^^^^^^^^^^^
    

    或将模板参数指定为

    auto it = lower_bound<decltype(events.begin()), std::vector<int>>(events.begin(), events.end(), {0, events[i][0]}, compar());
    //                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    【讨论】:

      猜你喜欢
      • 2010-12-22
      • 2012-11-14
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      相关资源
      最近更新 更多