У нас есть функция, которая принимает объект функции как параметр. Есть две перегрузки функции, которые отличаются сигнатурой функции.Почему компилятор не может определить этот шаблон функции?
#include <functional>
template <typename T>
void foo(std::function<void(T)> bar)
{
}
template <typename T>
void foo(std::function<void(int, T)> bar)
{
}
int main()
{
foo([](float number) {
});
return 0;
}
Однако этот код не компилируется.
error C2784: 'void foo(std::function<void(int,T)>)' : could not deduce template argument for 'std::function<void(int,T)>' from 'main::<lambda_2b4e4413ec419a4ac179a0b64ebde221>' : see declaration of 'foo'
error C2784: 'void foo(std::function<void(T)>)' : could not deduce template argument for 'std::function<void(T)>' from 'main::<lambda_2b4e4413ec419a4ac179a0b64ebde221>' : see declaration of 'foo'
Я думаю, что проблема как с самим шаблоном, так и с перегрузкой. Как я могу предоставить две функции, соответствующие указанным выше подписям?
лямбда не является производным от станд :: функция – 4pie0
Тип шаблона дедукция пытается найти типы для 'Т *, так что' станд :: функция <аннулируются (интермедиат , T)> 'или' std :: function 'соответственно, становится равным * типу аргумента' [] (float) {} '. Нет такого 'T', что делает тип лямбда равным некоторому типу' std :: function <..> '. –
dyp