首頁 > 後端開發 > C++ > 為什麼使用者定義的轉換時模板參數推導失敗?

為什麼使用者定義的轉換時模板參數推導失敗?

Barbara Streisand
發布: 2024-10-27 16:20:29
原創
484 人瀏覽過

 Why Does Template Argument Deduction Fail with User-Defined Conversions?

模板參數推導和使用者定義的轉換

在C 模板程式設計中,常見的任務是將一種類型的值傳遞給需要不同類型參數的模板函數。為了實現這一點,編譯器提供了模板參數推導(TAD),它可以根據實際參數的類型自動推斷模板參數。

模板參數推導的限制

但是,TAD 也有限制。一個限制是它不考慮使用者定義的轉換。這意味著,如果您有從一種類型到另一種類型的使用者定義轉換,TAD 將不會套用該轉換來推斷模板參數。

案例研究

考慮以下程式碼片段:

<code class="cpp">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
}
登入後複製

在這段程式碼中,我們有一個範本函數,它接受兩個參數:一個整數a 和一個Dtype 類型的標量物件。在 main 函數中,我們嘗試透過傳遞整數 a 和整數 2 來呼叫 func。但是,這失敗並出現編譯錯誤:

test.cpp: In function ‘int main()’:
test.cpp:32:12: error: no matching function for call to ‘func(int&, int)’
   func(a, 2);
            ^
test.cpp:32:12: note: candidate is:
test.cpp:25:6: note: template<class Dtype> void func(int, Scalar<Dtype>)
 void func(int a, Scalar<Dtype> b){
      ^
test.cpp:25:6: note:   template argument deduction/substitution failed:
test.cpp:32:12: note:   mismatched types ‘Scalar<Dtype>’ and ‘int’
   func(a, 2);</code>
登入後複製

為什麼TAD 失敗

失敗的原因是TAD 無法應用從int 到Scalar 的使用者定義轉換。為了實現這一點,我們需要在呼叫方明確轉換參數或為 Scalar 定義推導指南。

以上是為什麼使用者定義的轉換時模板參數推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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