簡體   English   中英

無法推斷模板參數(向量,std::function)

[英]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.

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