簡體   English   中英

可變參數模板專業化重載適用於 GCC 但不適用於 MSVC

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

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