微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:将 {} 传入时,“无法推断模板参数 '_Tp'”

如何解决错误:将 {} 传入时,“无法推断模板参数 '_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(),point,compar());

有人能解释一下原因吗?

解决方法

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(),{0,compar());
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。