Почему компилятор не может автоматически вывести тип шаблона класса?

Есть вот такой код

template <typename T, typename U>
class A
{
public:
    explicit A(U v) : field1{}, field2(v) {}

private:
    T field1;
    U field2;
};

int main()
{
    A<int> b("");
}

Собирается clang14, 17 стандарт. Получаю ошибку компиляции error:

too few template arguments for class template 'A'

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


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

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

Для шаблонов классов, в отличие от функций, выводятся или все шаблонные аргументы, или никакие. Если указать хотя бы один аргумент, то остальные не будут выводиться.

Это обходят так:

template <typename T> struct tag {};

template <typename T, typename U>
class A
{
  public:
    explicit A(tag<T>, U v) : field1{}, field2(v) {}

  private:
    T field1;
    U field2;
};

int main()
{
    A b(tag<int>{}, "");
}
→ Ссылка