【问题标题】:Attempt to cast std::chrono::duration gives "rep cannot be a duration" compilation error尝试强制转换 std::chrono::duration 给出“rep cannot be a duration”编译错误
【发布时间】:2017-08-14 23:59:04
【问题描述】:

当然我在这里做了一些愚蠢的事情,但我在编译我的简单秒表类时遇到了麻烦。错误是:

/usr/include/c++/4.9/chrono:246:2:错误:静态断言失败:rep 不能是持续时间

我想将两个 std::chrono::high_resolution_clock 之间的时间差转换为毫秒。我确信这段代码曾经可以工作(错误的记忆或者可能是 2015 年比 2013 年更好的标准)。

repo is here

#include <iostream>
#include <chrono>

class Stopwatch final
{
public:

    using elapsed_resolution = std::chrono::milliseconds;
    using elapsed_duration = std::chrono::duration<std::chrono::milliseconds>;

    Stopwatch()
    {
        Reset();
    }

    void Reset()
    {
        reset_time = clock.now();
    }

    elapsed_duration Elapsed()
    {
        return std::chrono::duration_cast<elapsed_resolution>(clock.now() - reset_time);
    }

private:

    std::chrono::high_resolution_clock clock;
    std::chrono::high_resolution_clock::time_point reset_time;
};

int main(void)
{
    auto s = Stopwatch();

    std::cout << s.Elapsed().count() << std::endl;
}

【问题讨论】:

  • 问题是using elapsed_duration = std::chrono::duration&lt;std::chrono::milliseconds&gt;;。请阅读docs。顺便说一句,这从现代编译器的错误消息中很明显:wandbox.org/permlink/rOfqAkm9XqvZXpkI
  • 我想返回一个时间间隔。 elapsed_duration 是一个时间间隔,不是吗?
  • 不,正如错误所说,某些持续时间的表示可能不是另一个持续时间。
  • 我不明白,主要是因为如果您阅读文档,您会在 duration_cast 示例中看到这一点。
  • 抱歉,我找不到上述示例。如果它应该存在,那就错了。

标签: c++ casting chrono


【解决方案1】:

这里的这一行:

using elapsed_duration = std::chrono::duration<std::chrono::milliseconds>;

需要是这样的:

using elapsed_duration = std::chrono::duration<float, std::milli>;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2016-07-20
    • 2014-09-07
    • 2018-02-03
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多