Нет подсказки Не путает ли специализированный аргумент по умолчанию вывод типа шаблона?

Приведенный ниже код не удалось скомпилировать. Компилятор обвиняет candidate template ignored: couldn't infer template argument 'Rep2'. Я ожидаю предоставить d1 и использовать значение по умолчанию как d2.

Это связано со значением по умолчанию d2=std::chrono::minutes(1), которое запутало вывод типа? Однако по умолчанию используется второй аргумент, который является желаемым значением по умолчанию, поскольку в операторе BAr bar{...} нет второго аргумента.

#include<chrono>

struct Bar
{
  std::chrono::nanoseconds duration1;
  std::chrono::nanoseconds duration2;

  Bar()=delete;
  template<class Rep,class Period,class Rep2,class Period2>
  Bar(
      const std::chrono::duration<Rep, Period> &d1,
      const std::chrono::duration<Rep2, Period2> &d2=std::chrono::minutes(1)):
      duration1(std::chrono::duration_cast<std::chrono::nanoseconds>(d1)),
      duration2(std::chrono::duration_cast<std::chrono::nanoseconds>(d2))
  {
  }
};

int main()
{
  Bar bar{std::chrono::hours(7)};
}


person Victor Tsang    schedule 25.05.2020    source источник
comment
Спасибо за ссылку... так что, не лучше ли указать значение по умолчанию для аргументов шаблона в целом? Для этой проблемы я могу придумать способы избежать ошибки, предоставив 2 ctor: `Bar(d1);`, которые инициализируют duration2 значением по умолчанию, а другой ctor Bar(d1,d2); не имеет аргумента по умолчанию.   -  person Victor Tsang    schedule 25.05.2020
comment
Нет, вам просто нужно добавить значения по умолчанию для Rep2 и Period2   -  person Alan Birtles    schedule 25.05.2020
comment
Поскольку ваш вопрос уже помечен как ответ, я добавлю свои замечания в качестве комментария. std::chrono::duration допускает неявное приведение к меньшему блоку, поскольку нет потери информации. В вашем примере вообще нет необходимости использовать шаблоны, поскольку std::chrono::nanoseconds - это наименьший возможный интервал продолжительности. Посмотрите этот пример на godbolt: gcc.godbolt.org/z/EvRQcJ   -  person Simon Kraemer    schedule 25.05.2020