Почему в следующем фрагменте кода тип шаблона не может быть выведен автоматически из последнего аргумента, как в std::condition_variable::wait
?Почему шаблонный улов отсутствует здесь?
template< typename Predicate >
//requires Truth<Predicate>
class lock_monitor_guard
{
public:
lock_monitor_guard(std::mutex& mutex, std::condition_variable& monitor, Predicate predicate);
~lock_monitor_guard();
private:
std::unique_lock<std::mutex> lock;
std::condition_variable& monitor;
};
template< typename Predicate >
//requires Truth<Predicate>
lock_monitor_guard<Predicate>::lock_monitor_guard(std::mutex& mutex, std::condition_variable& monitor, Predicate predicate)
: lock(mutex), monitor(monitor)
{
monitor.wait<Predicate>(lock, predicate);
}
template< typename Predicate >
//requires Truth<Predicate>
lock_monitor_guard<Predicate>::~lock_monitor_guard()
{
lock.unlock();
monitor.notify_one();
}
Когда я пытаюсь построить линию как lock_monitor_guard guard(jobs_mutex, jobs_monitor, ([]()->bool{return true;}));
, у меня есть сообщение об ошибке: use of class template 'lock_monitor_guard' requires template arguments
. Но почему ? И почему он работает с STL std::condition_variable::wait
. Спасибо за любую помощь !
Вы должны указать тип шаблона lock_monitor_guard. – Jagannath
Да, но почему? Я не хочу угадывать ужасный тип лямбды! И почему 'std :: condition_variable :: wait' отличается? –
вы можете перемещать 'template', чтобы сделать его частью объявления конструктора, тогда он будет работать. весь класс 'lock_monitor_guard' не должен быть параметризован с типом' Predicate' –