模板參數推導和隱式類型轉換
在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
可能的解決方案
要修復對於此問題,您有多種選擇:
調用方顯式轉換:
<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)添加標量推導指南:
<code class="cpp">func<int>(a, 2);</code>
以上是為什麼 C 中的隱式類型轉換導致模板參數推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!