首頁 > 後端開發 > C++ > 為什麼 C 中的隱式類型轉換導致模板參數推導失敗?

為什麼 C 中的隱式類型轉換導致模板參數推導失敗?

Barbara Streisand
發布: 2024-10-28 07:05:02
原創
681 人瀏覽過

Why Does Template Argument Deduction Fail with Implicit Type Conversions in C  ?

模板參數推導和隱式類型轉換

在C 語言中,模板參數推導是一個強大的功能,可以根據模板參數的類型會自動判斷模板參數的類型。關於調用者的論點。但是,在推導過程中不會考慮某些類型的轉換,包括使用者定義的轉換。

隱式轉換問題

考慮以下程式碼片段:

<code class="cpp">template<typename Dtype>
class Scalar{
    Scalar(Dtype v) : value_(v){}
private:
    Dtype value_;
};</code>
登入後複製

Scalar 類別表示簡單的值類型。現在,考慮以下模板函數:

<code class="cpp">template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
    cout << "ok" <<endl;
}
登入後複製

此函數接受一個 int 和一個 Scalar

在下面的 main 函數中,我們嘗試使用 int 和 int 值來呼叫 func:

<code class="cpp">int main(){
    int a = 1;
    func(a, 2); // ERROR: template argument deduction fails
    return 0;
}
登入後複製

但這會導致編譯錯誤,指出模板論證推論失敗。這是因為編譯器無法自動將 int 值 2 轉換為 Scalar 。目的。在模板參數推導過程中,不會考慮使用者定義的轉換,例如 Scalar::Scalar(Dtype value)。

可能的解決方案

要修復對於此問題,您有多種選擇:

  • 調用方顯式轉換:

    <code class="cpp">func(a, Scalar<int>(2));</code>
    登入後複製

    這會手動將int 值轉換為標量< ;int>;

  • 推導指南:

    推導指南:
    <code class="cpp">template<typename T>
    Scalar(T v) -> Scalar<T>;</code>
    登入後複製

    推導指南:
    <code class="cpp">func(a, 2);</code>
    登入後複製
  • 推導指南:

    (僅限C 17)添加標量推導指南:

    這告訴編譯器在從調用者的參數推導Scalar 類型時更喜歡這個推導指南,允許您將func 調用為:
    <code class="cpp">func<int>(a, 2);</code>
    登入後複製

  • 明確實例化: 您可以明確實例化特定類型的func:這會強制編譯器使用Dtype = int 實例化函數,從而避免模板參數推導的需要。

    以上是為什麼 C 中的隱式類型轉換導致模板參數推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板