Почему тип не выводится автоматом?

template<typename retType,class Func >
class Call
{
public:
    Call(Func* func)
    {
        func(500,500);
    };
};

Использование:

Call<int> call(Beep);//ошибка "слишком мало аргументов шаблона"

Почему тип func не может быть автоматов выведен? С функциями так можно:

template<typename retType, class Func >
void fnc(Func* func)
{
    func(500, 500);
}

Использование:

fnc<int>(Beep);// все работает

Ответы (1 шт):

Автор решения: HolyBlackCat

Для шаблонов классов выводятся или все аргументы, или никакие.

Это обходится синтаксисом в духе Call call(tag<int>{}, Beep);, где tag - это

template <typename> struct tag {};

, а конструктор выглядит так:

Call(tag<retType>, Func* func)
→ Ссылка