Как определить руководство по выводу с помощью шаблонного конструктора?
Чтобы упростить мою проблему, я буду использовать std::unique_lock
как инструмент для объяснения. У std::unique_lock есть аргумент шаблона, мьютекс. Тем не менее, его конструктор также является функцией шаблона unique_lock(TMutex &, const chrono::duration<_Rep, _Period>&)
,
Когда вы используете это, вы можете написать:
auto lock = std::unique_lock(my_mutex, 5s);
Итак, вопрос: как выписать руководство по выводу для этого (без изменения поведения), как это сделать?
Моя лучшая попытка до сих пор:
template<typename _Mutex>
template<typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;
К сожалению, Clang не принимает это:
ошибка: посторонний список параметров шаблона в специализации шаблона или определение внешнего шаблона
1 ответ
GCC имеет лучшее сообщение об ошибке для этого:
ошибка: слишком много списков параметров шаблона
Вы можете изменить его на один список параметров шаблона, например так:
template<typename _Mutex, typename _Rep, typename _Period>
unique_lock(_Mutex &, const chrono::duration<_Rep, _Period>&) -> unique_lock<_Mutex>;
И это работает.
Из комментариев в вашем вопросе вы, кажется, смешиваете CTAD и специализации.
Вы ничего не специализируете на unique_lock
, Не функция-член, не конструктор, вы просто определяете руководство по выводу. Более конкретно, из cppreference:
Синтаксис определяемого пользователем руководства по выводам - это синтаксис объявления функции с завершающим типом возврата [...] Руководство по выводам не является функцией [...]
Обратите внимание, что он имеет синтаксис объявления, а не специализации. Это просто отличается от того, что вы ожидали.