[英]Variadic Template Specialization Overload works in GCC but not MSVC
我有以下 function 聲明
template<typename RET, typename... PARAMS>
RET Execute(PARAMS... params)
{ ... }
template<typename RET>
RET Execute()
{ ... }
template<typename... PARAMS>
void Execute(PARAMS... params)
{ ... }
void Execute();
這些調用在 GCC 和 MSVC 中都可以正常工作
Execute<int32_t>(static_cast<int8_t>(0), static_cast<int32_t>(0))
Execute<int32_t>()
Execute(static_cast<uint8_t>(0))
Execute()
此調用在 GCC 中運行良好,但在 MSVC 中則不行。 我收到一個關於重載 function 的模棱兩可調用的錯誤。 只是因為返回類型與第一個參數相同。
Execute<int32_t>(static_cast<int32_t>(0), static_cast<int32_t>(0))
考慮到不可能顯式地給出參數包的類型名,所以它不是模棱兩可的。 為什么 MSVC 似乎有這個錯誤? 有沒有什么辦法解決這一問題?
此調用在 GCC 中運行良好,但在 MSVC 中則不行。
在我的 Debian 穩定版中,clang++ 11.0.1-2 (“錯誤:調用‘執行’不明確”)和 g++ 10.2.1(“錯誤:調用重載 '2Exect_<int32_> , int32_t)' 不明確")。
考慮到不可能顯式給出參數包的類型名
不完全是:您可以明確 arguments 的類型名稱或第一個 arguments 的類型; 此許可覆蓋從 arguments 中扣除的類型名稱。
為什么 MSVC 似乎有這個錯誤?
我的問題是:為什么你的 g++ 似乎有這個權利?
有沒有什么辦法解決這一問題?
是的,一個非常簡單的方法:在參數類型的可變參數列表之前添加一個非類型模板參數的可變參數列表。
我的意思是,寫第三個Execute()
如下
template <int..., typename... PARAMS>
void Execute (PARAMS... params)
{ /* ... */ }
也許也是第一個如下
template <typename RET, int..., typename... PARAMS>
RET Execute (PARAMS... params)
{ /* ... */ }
通過這種方式,您可以從params
中強制執行PARAMS
類型推斷,並且顯式模板參數必然是返回類型(當您可以表達它時)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.