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

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

Barbara Streisand
Barbara Streisand原創
2024-10-28 07:05:02747瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn