首頁 > 後端開發 > C++ > 主體

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

Barbara Streisand
發布: 2024-10-28 23:17:30
原創
855 人瀏覽過

Why Does Implicit Type Conversion Fail in Template Argument Deduction?

隱式類型轉換和模板推導

在C 語言中,模板參數推導是一種允許根據類型參數自動推斷出類型參數的機制。函數參數。然而,模板推導中的隱式類型轉換是有限制的。

考慮下面的程式碼片段:

<code class="cpp">#include<iostream>
using namespace std;

template<typename Dtype>
class Scalar{
public:
  Scalar(Dtype v) : value_(v){}
private:
  Dtype value_;
};

template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
  cout << "ok" <<endl;
}

int main(){
  int a = 1;
  func(a, 2); // error: no matching function for call to ‘func(int&, int)’
  return 0;
}
登入後複製

這裡,目標是使用整數呼叫 func() 模板函數a 和隱式轉換的 Scalar物件 2。但是,這會導致編譯錯誤。這是為什麼?

理解錯誤

編譯器無法執行模板參數推導,因為:

  • 未考慮隱式類型轉換在模板參數推導過程中。
  • 從 int 到 Scalar 的轉換是使用者定義的轉換,編譯器在推導時無法辨識。

解決方案選項

要解決此問題,可以採取多種方法:

  • 在呼叫方明確轉換:
    在呼叫方手動轉換參數:

    <code class="cpp">func(a, Scalar<int>{2});</code>
    登入後複製
  • 推導指引(C 17 ):

    推導指引(C 17 ):
    <code class="cpp">func(a, Scalar{2});</code>
    登入後複製
  • 為Scalar 定義推導指南,並呼叫func() 為:

  • 明確模板實例化(僅當標量建構子不顯式時):
    <code class="cpp">func<int>(a, 2); </code>
    登入後複製
  • 明確實例化所需類型參數的func() 範本:

    結論

    結論結論結論結論結論 C 中的模板參數推導是一種強大的機制,但在處理使用者定義的轉換時它有其限制。透過利用所討論的解決方案,開發人員可以確保使用預期的類型參數來呼叫模板函數。

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

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