![](/img/trans.png)
[英]Could not deduce template argument for std::function from std::bind
[英]Could not deduce template argument (vector, std::function)
我創建了一個模板化的 function,我試圖自動推斷出模板參數。 MCVE(編譯它):
template<class Value, class Allocator>
void foo(const std::vector<Value, Allocator>& v, const std::function<void(const Value&)>& f)
{
}
int main()
{
vector<int> v;
foo<int>(v, [](const int&){}); //okay
//foo(v, [](const int&){}); //not okay
return 0;
}
我首先認為不能推斷分配器,但這似乎並沒有解決它。 我的下一個猜測是它與 lambda 到 std::function 有關,但不知道那里的進一步步驟。 有人知道我需要做什么才能使這個可推論嗎?
Ps:我知道“const int&”可能會變成“int”,但在實際代碼中存在非標量數據類型。
模板參數推導不考慮隱式轉換。
類型推導不考慮隱式轉換(除了上面列出的類型調整):這是 重載決議的工作,稍后會發生。
然后在第二個 function 參數f
上鍵入模板參數Value
的類型推導失敗,因為從 lambda 到std::function
的隱式轉換未被考慮。
正如您所展示的,您可以顯式指定模板 arguments(以繞過模板參數推導)。 或者,您可以通過使用std::type_identity
將第二個參數聲明為非推導上下文來排除推導。
使用限定 ID指定的類型的嵌套名稱說明符(scope 解析運算符
::
左側的所有內容):
例如
template<class Value, class Allocator>
void foo(const std::vector<Value, Allocator>& v, const std::function<void(const std::type_identity_t<Value>&)>& f)
{
}
PS:從 C++20 開始支持std::type_identity
; 如果您使用的編譯器不支持它,那么制作它並不難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.