Template Argument Deduction Failure: Understanding Nondeduced Contexts
In your code, you've defined two functions (temp and temp2) that intend to deduce the template arguments based on the parameter types. However, you encounter compiler errors stating that it's unable to deduce these arguments.
The issue stems from the use of the typename keyword in the function definitions:
// Example 1 template <class A> A temp(typename S<A>::type a1) // Example 2 template <class A, class B> B temp2(typename S<A>::type a1, B a2)
When using template template parameters, typename is necessary to refer to dependent names within the template class. However, this is not the case in the context of your functions, where S::type is simply a non-dependent type.
In C , template argument deduction occurs when a template parameter is used in a context that determines its type. However, in this instance, the template parameter A is used in a nondeduced context, as it appears only in the declaration of a reference type:
typedef typename T& type;
As a result, the compiler cannot deduce the template argument from the function call. To resolve this issue, you need to explicitly specify the template argument when calling these functions:
temp<char>(c);
By providing the explicit argument, the compiler is able to correctly instantiate the template with the appropriate type.
The above is the detailed content of Why Does My C Template Argument Deduction Fail in Nondeduced Contexts?. For more information, please follow other related articles on the PHP Chinese website!