【问题标题】:template parameter type deduction in user defined conversion自定义转换中的模板参数类型推导
【发布时间】:2019-04-17 03:08:39
【问题描述】:

我正在尝试创建一个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); //失败!!!无法理解为什么... ^

在 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::duration<_rep1 _period1>’派生的 std::this_thread::sleep_for(timeout); //失败!!!不明白为什么...

【问题讨论】:

  • “这里是完整的代码示例”#includes 在哪里?
  • @Swordfish 他们肯定不会帮助理解这个问题。
  • @Swordfish 对不起..我已经更新了。
  • @Zereges 这将有助于我添加它们太花边。

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


【解决方案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

【讨论】:

  • 我明白这一点。但是我需要做什么才能使用像std::this_thread::sleep_for(timeout) 这样的语法?如何“告诉”编译器我希望将 struct timeout 转换为 `std::chrono::duration'?
  • @JacintoResende 你可以明确地转换它std::this_thread::sleep_for(static_cast&lt;timeout_tp::Duration_&gt;(timeout)) 或明确地指定模板参数std::this_thread::sleep_for&lt;timeout_tp::rep_, timeout_tp::period_&gt;(timeout)。或者,您也可以编写自己的 sleep_for 函数,以方便使用 timeout_tp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2018-05-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多