Я пытаюсь создать шаблонную функцию с необязательным аргументом, и мне трудно понять, почему компиляция не удалась.Это мой тестовый (надуманный) код:
#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 << "NumElements =" << GetCountIf (v) << '\ n';^ ~~~~~~~~~ main.cpp: 5: 5: note: шаблон кандидата игнорируется: невозможно определить аргумент шаблона 'UnaryPredicate' int GetCountIf (std :: vector v, UnaryPredicate pred = {return true;}) {^ 1 сгенерирована ошибка. </p>
Когда компилятор сталкивается с вызовом GetCountIf
только с одним аргументом, почему он не может определить тип необязательной лямбды?Если я явно указываю тип предиката следующим образом, он работает:
template <typename T, class UnaryPredicate = std::function<bool(T)>>
int GetCountIf(std::vector<T> v, UnaryPredicate pred = [](T) { return true;}) {
...
}
Почему это работает?
(я использую C ++ 14)