首页 > 解决方案 > 错误:“无法推断模板参数 '_Tp'” 将 {} 传入

问题描述

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++templatescompiler-errorstemplate-argument-deductionbraced-init-list

解决方案


Braced-init-list 本身没有类型,不能用于模板参数的推导。这是非推断上下文

在以下情况下,用于构成 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());
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

推荐阅读