Как определить руководство по выводу с помощью шаблонного конструктора?

Чтобы упростить мою проблему, я буду использовать 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:

Синтаксис определяемого пользователем руководства по выводам - ​​это синтаксис объявления функции с завершающим типом возврата [...] Руководство по выводам не является функцией [...]

Обратите внимание, что он имеет синтаксис объявления, а не специализации. Это просто отличается от того, что вы ожидали.

Другие вопросы по тегам