用户定义转换中的模板参数类型推导

时间:2018-11-14 07:50:01

标签: c++ c++11 templates type-conversion type-deduction

我正在尝试创建一个struct timeout。我想直接使用它。 std::this_thread::sleep_for(timeout)。但是,由于某些我无法理解的原因,从struct timeoutstd::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); //失败!!!不明白为什么...                                        ^

在main.cpp包含的文件中:16:0: / usr / include / c ++ / 7 / thread:361:7:注意:候选:模板无效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 :: duration <_Rep1,_Period1>”     std :: this_thread :: sleep_for(timeout); //失败!!!不明白为什么...

1 个答案:

答案 0 :(得分:1)

::std::this_thread::sleep_for是一个声明为

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

当您传递timeout_tp模板参数RepPeriod的实例时,不能定义用户定义的转换运算符timeout_tpstd::chrono::milliseconds的情况。甚至考虑在内。