【问题标题】:How to declare a variable which can be set into a param of type std::chrono::milliseconds如何声明一个可以设置为 std::chrono::milliseconds 类型参数的变量
【发布时间】:2017-11-30 10:18:38
【问题描述】:

我有下面的方法,它摄入std::chrono::milliseconds

void SomeMethod(std::chrono::milliseconds some_value) {

  // some logic
}

我可以通过以下方式调用它:

using namespace std::chrono_literals;
SomeMethod(1000ms);

有效。
但是,我想通过传递一个成员变量或一些全局声明的变量以下列方式调用它。像这样的,

using namespace std::chrono_literals;
std::chrono::system_clock::duration timeout = 3000ms;

但我收到以下错误:

error: no viable conversion from 'duration<[...], ratio<[...], 1000000>>' to 'duration<[...], ratio<[...], 1000>>'
SomeMethod(some_value);
                                                                             ^~~~~~~

【问题讨论】:

  • 你的初始化不应该是:std::chrono::milliseconds timeout = 3000ms;

标签: c++ c++11 chrono


【解决方案1】:

错误消息告诉您正在尝试将微秒转换为毫秒。 system_clock::duration 必须是您平台上 std::chrono::microseconds 的 typedef。

您可以像在std::chrono::system_clock::duration timeout = 3000ms; 行中那样从milliseconds 隐式转换为microseconds,但要以其他方式转换您需要duration_cast

std::chrono::duration_cast<std::chrono::milliseconds>(timeout);

【讨论】:

  • 请注意,这种转换可能是有损的。如果系统时钟时间单位是分钟 (!) 3000ms 将映射到 0 分钟,这可能不是您想要的。再说一次,你的平台就像一个时钟,每分钟都在滴答作响,所以也许你有更大的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多