Implicit Type Conversion and Template Deduction
In C , template argument deduction is a mechanism that allows type parameters to be automatically inferred based on the function arguments. However, there are limitations to implicit type conversion in template deduction.
Consider the following code snippet:
<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; }
Here, the goal is to call the func() template function with an integer a and an implicitly converted Scalar Understanding the Error The compiler fails to perform template argument deduction because: Solution Options To resolve this issue, several approaches can be taken: Explicit Conversion at Caller Site: Deduction Guide (C 17 ): Explicit Template Instantiation (Only if Scalar Conclusion Template argument deduction in C is a powerful mechanism, but it has limitations when dealing with user-defined conversions. By utilizing the discussed solutions, developers can ensure that template functions are called with the intended type parameters. The above is the detailed content of Why Does Implicit Type Conversion Fail in Template Argument Deduction?. For more information, please follow other related articles on the PHP Chinese website!
Convert the argument manually at the caller site:<code class="cpp">func(a, Scalar<int>{2});</code>
Define a deduction guide for Scalar and call func() as:<code class="cpp">func(a, Scalar{2});</code>
Explicitly instantiate the func() template for the desired type parameter:<code class="cpp">func<int>(a, 2); </code>