Search code examples
c++templatesdefaulttemplate-argument-deductiondefault-arguments

Can C++ deduce argument type from default value?


I tried to write this function with a default template argument:

template<typename A, typename B>
void func(int i1, int i2, A a, B b = 123){
    ...
}

In my mind I can call it like this: func(1, 2, 3) and compiler should deduce type B as int from default value, but I get no instance of overloaded function.
Is it incorrect C++ construction and compiler can't deduce type in this case?


Solution

  • The type of a template parameter in a function can't be deduced from a default argument. As shown in the example on cppreference.com:

    Type template parameter cannot be deduced from the type of a function default argument:

    template<typename T> void f(T = 5, T = 7); 
    
    void g()
    {
        f(1);     // OK: calls f<int>(1, 7)
        f();      // error: cannot deduce T
        f<int>(); // OK: calls f<int>(5, 7)
    }
    

    However, you can specify a default argument for the template parameter:

    template<typename A, typename B = int>
    void func(int i1, int i2, A a, B b = 123){
        ...
    }