【发布时间】: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