簡體   English   中英

為什么這段代碼有C2784“無法推斷模板參數”錯誤

[英]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)'的模板參數

為什么這樣? 我認為通過傳入dValueType可以推導為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM