我們有一個函數將一個函數對象作爲參數。函數有兩個重載,它們在函數簽名中有所不同。編譯器爲什麼不能推導出這個函數模板?
#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'
我認爲模板本身和過載都有問題。我如何提供兩個符合上述簽名的功能?
拉姆達具體是不是自std ::功能 – 4pie0 2014-09-06 13:34:45
模板類型推演試圖找到類型'T',這樣'的std ::功能<無效(INT ,T)>或'std :: function'分別與參數'[](float){}'的類型相等*。沒有這樣的'T'使得lambda的類型等於一些'std :: function <..>'類型。 –
dyp
2014-09-06 13:36:32