模板參數推導和隱式類型轉換
在C 語言中,模板參數推導是一個強大的功能,可以根據模板參數的類型會自動判斷模板參數的類型。關於調用者的論點。但是,在推導過程中不會考慮某些類型的轉換,包括使用者定義的轉換。
隱式轉換問題
考慮以下程式碼片段:
<code class="cpp">template<typename dtype> class Scalar{ Scalar(Dtype v) : value_(v){} private: Dtype value_; };</typename></code>
Scalar 類別表示簡單的值類型。現在,考慮以下模板函數:
<code class="cpp">template<typename dtype> void func(int a, Scalar<dtype> b){ cout <p>此函數接受一個 int 和一個 Scalar<dtype> 。 </dtype></p> <p>在下面的 main 函數中,我們嘗試使用 int 和 int 值來呼叫 func:</p> <pre class="brush:php;toolbar:false"><code class="cpp">int main(){ int a = 1; func(a, 2); // ERROR: template argument deduction fails return 0; }</code>
但這會導致編譯錯誤,指出模板論證推論失敗。這是因為編譯器無法自動將 int 值 2 轉換為 Scalar
可能的解決方案
要修復對於此問題,您有多種選擇:
調用方顯式轉換:
<code class="cpp">func(a, Scalar<int>(2));</int></code>
這會手動將int 值轉換為標量< ;int>;
推導指南:
<code class="cpp">template<typename t> Scalar(T v) -> Scalar<t>;</t></typename></code>推導指南:
<code class="cpp">func(a, 2);</code>
(僅限C 17)添加標量推導指南:
<code class="cpp">func<int>(a, 2);</int></code>
以上是為什麼 C 中的隱式類型轉換導致模板參數推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!