我正在嘗試顯式實體化一個模板化函式,該函式具有默認模板引數以及相應引數的默認值,但我找不到正確的語法。我正在嘗試的是以下內容:
// in .hpp
template<typename T = std::function<void(int,int)>> void foo (T &&t = [](int,int)->void{});
//in .cpp
template<typename T> void foo (T t){...}
template void foo<>();
但我只是得到一個錯誤,說 foo<> 不匹配任何模板宣告。有什么方法可以使用默認型別和引數值,同時仍然能夠進行顯式實體化?對我來說,唯一的其他選擇是在標題中定義我不希望這樣做的整個函式,或者放棄使用默認值。
uj5u.com熱心網友回復:
問題是您沒有保持簽名一致。標頭中的宣告通過右值參考接受,實作檔案通過值接受,并且實體化是針對絕對沒有引數的函式(默認引數并不意味著函式沒有引數)。
您需要在任何地方堅持相同的簽名。
所以要么
#include <functional>
template<typename T = std::function<void(int,int)>> void foo (T &&t = [](int,int)->void{});
//in .cpp
template<typename T> void foo (T&&){}
template void foo<>(std::function<void(int,int)>&&);
或者
#include <functional>
template<typename T = std::function<void(int,int)>> void foo (T t = [](int,int)->void{});
//in .cpp
template<typename T> void foo (T){}
template void foo<>(std::function<void(int,int)>);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/410972.html
標籤:
下一篇:C 類大小模板推導
