【发布时间】:2019-07-14 23:13:45
【问题描述】:
我正在尝试使用可选参数创建一个模板化函数,但我无法理解编译失败的原因。这是我的测试(人为)代码:
#include <iostream>
#include <vector>
template <class UnaryPredicate>
int GetCountIf(std::vector<int> v, UnaryPredicate pred = [](auto) { return true; }) {
int count=0;
for (auto i: v) {
if (pred(i)) {
count++;
}
}
return count;
}
int main() {
auto v = std::vector<int>{0, 1, 2, 3, 4, 5};
std::cout << "NumOddElements=" << GetCountIf(v, [](auto val) { return (val % 2 == 1); }) << '\n';
// std::cout << "NumElements=" << GetCountIf(v) << '\n';
}
仅当我使用两个参数调用 GetCountIf() 时,代码才会编译。如果我尝试只传递 1 个参数,编译会失败并出现以下错误:
main.cpp:18:34: 错误:没有匹配的函数调用“GetCountIf”
std::cout
当编译器遇到只有 1 个参数的 GetCountIf 调用时,为什么它不能推断出可选 lambda 的类型?如果我像这样明确指定谓词的类型,它会起作用:
template <typename T, class UnaryPredicate = std::function<bool(T)>>
int GetCountIf(std::vector<T> v, UnaryPredicate pred = [](T) { return true;}) {
...
}
为什么会这样?
(我使用的是 C++14)
【问题讨论】:
标签: c++ templates template-argument-deduction