[英]why this code have C2784 “could not deduce template argument” error
從作為參數傳遞的Lambda函數我可以編譯示例:
template <class Range>
Range FindFirstIf(Range, bool(*Function)(typename Range::ConstReference value));
struct range { using ConstReference = const float&; };
range rng;
rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); });
當然,由於未實現FindFirstIf
,因此無法鏈接。
但是,當我做了類似的事情:
template <class Range, class ValueType>
Range MyTest(Range, ValueType, bool(*Function)(ValueType value));
std::vector <int> vi;
double d = 0;
vi = MyTest(vi, d, [](double val) { return (val < 0.0f); });
它有編譯錯誤:
錯誤C2784:'Range MyTest(Range,ValueType,bool(__ cdecl *)(ValueType))':無法從'main ::'推斷'bool(__ cdecl *)(ValueType)'的模板參數
為什么這樣? 我認為通過傳入d
, ValueType
可以推導為double
?
改為使用它(注意+
):
vi = MyTest(vi, d, +[](double val) { return (val < 0.0f); });
在某些情況下,Lambda函數可以衰減到函數指針,但它們本身不是函數指針。
換句話說,演繹失敗是因為它期望在函數指針上工作,但lambda不是函數指針,當然可以轉換它,但首先必須進行演繹,但它不能用於lambda而不是預期的類型 ,它可以腐爛...等等。
通過在lambda前面添加+
,可以在將轉換傳遞給函數之前強制轉換,因此MyTest
會按預期接收實際的函數指針並繼續進行推導。
這是一個基於您的代碼的最小的工作示例:
#include<vector>
template <class Range, class ValueType>
Range MyTest(Range, ValueType, bool(*Function)(ValueType value)) {}
int main() {
std::vector <int> vi;
double d = 0;
vi = MyTest(vi, d, +[](double val) { return (val < 0.0f); });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.