c++ - 错误:“无法推断模板参数 '_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());
有人可以解释为什么吗?
解决方案
Braced-init-list 本身没有类型,不能用于模板参数的推导。这是非推断上下文:
在以下情况下,用于构成 P 的类型、模板和非类型值不参与模板参数推导,而是使用在其他地方推导或显式指定的模板参数。如果模板参数仅在非推导上下文中使用且未明确指定,则模板参数推导失败。
- 参数 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());
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
推荐阅读
- python - 如何检查我的 python 守护程序是否实际运行,即获取进程的日志?
- python-3.x - 停止在无头浏览器中播放音乐
- excel - 将数据从用户输入的范围复制到确定的模板
- google-cloud-platform - 部署在 AI 平台中的 Torch-Model 生成“预测失败:未知错误”。
- ansible - 在混合环境中运行 ansible 命令
- error-handling - 尝试在 optaplannercode 的实体上添加哈希码时出错
- c++ - 已知大小数组的基本代数运算
- java - 链接几个CompletionStage,这在内存中是如何处理的?
- php - 在 Git Bash / Windows 8.1 中使用 PHP 的替代版本
- javascript - 我可以在 joomla / joomshaper 的图表中添加数据提要吗