вычет типа параметра шаблона в пользовательском преобразовании - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь создать struct timeout.Я хотел бы использовать его напрямую. Например, std::this_thread::sleep_for(timeout).Однако мое преобразование, определенное пользователем, не выполняется при преобразовании из struct timeout в std::chrono::duration<rep,period> по какой-то причине, которую я не могу понять.Вот полный пример кода:

#include <chrono>
#include <thread>
template <typename Duration = std::chrono::milliseconds>
struct timeout_tp
{
   using Duration_   = Duration;
   using rep_        = typename Duration_::rep;
   using period_     = typename Duration_::period;

   timeout_tp(const rep_ &timeout) : timeout{timeout} {}    
   operator Duration_() const {return timeout;}
   Duration_ operator()() const {return timeout;}
   //...
   private:   
   Duration_ timeout;
};

int main()
{
   timeout_tp<std::chrono::seconds> timeout{1};
   std::chrono::seconds x = timeout; //OK: struct timeout conversion to std::chrono::seconds.
   std::this_thread::sleep_for(x);
   //std::this_thread::sleep_for(timeout); : FAILS!!! Can't understand why... 
   std::this_thread::sleep_for(timeout()); //OK : struct timeout operator() returns std::chrono::seconds.
   return 0;
}

Что я делаю не так?

Что мне нужно сделать, чтобы использовать нужный синтаксис?

Сообщения об ошибках, выданныекомпилятор:

main.cpp: 38: 39: ошибка: нет соответствующей функции для вызова 'sleep_for (timeout_tp <> &)' std :: this_thread :: sleep_for (timeout);// FAILS !!!Не могу понять, почему ... ^

В файле из main.cpp: 16: 0: / usr / include / c ++ / 7 / thread: 361: 7: примечание: кандидат: шаблон void std:: this_thread :: sleep_for (const std :: chrono :: duration <_Rep1, _Period1> &) sleep_for (const chrono :: duration <_Rep, _Period> & __rtime) ^ ~~~~~~~~ / usr / include /c ++ / 7 / thread: 361: 7: примечание: ошибка вывода / замены аргумента шаблона:

main.cpp: 38: 39: примечание: timeout_tp <> 'не является производным от const std :: chrono:: длительность <_Rep1, _Period1> 'std :: this_thread :: sleep_for (timeout);// FAILS !!!Не могу понять, почему ...

1 Ответ

0 голосов
/ 14 ноября 2018

::std::this_thread::sleep_for - это шаблон, объявленный как

template< class Rep, class Period >
void sleep_for( const std::chrono::duration<Rep, Period> & sleep_duration );

. При передаче экземпляра timeout_tp параметры шаблона Rep и Period не могут быть выведены и пользовательский оператор преобразования timeout_tp до std::chrono::milliseconds даже не учитывается.

...