【问题标题】:Is it possible to use std::chrono::duration with Rep type as double? I get compiler error in vs2012 when I try是否可以将 Rep 类型的 std::chrono::duration 用作 double 类型?尝试时在 vs2012 中出现编译器错误
【发布时间】:2014-09-07 23:59:36
【问题描述】:

我收到以下编译器 (vs2012) 错误:

错误 3 错误 C2679: 二进制 '+=' : 找不到运算符 'const std::chrono::duration<_rep>' 类型的右手操作数 (或没有可接受的转换) c:\program files (x86)\microsoft visual studio 11.0\vc\include\chrono 749

我对持续时间的定义是:

// Tick interval type in nanoseconds
typedef std::chrono::duration<double, std::ratio<1, 100000000>> tick_interval_type;

当我使用浮点数时出现同样的错误...它仅在持续时间的 Rep 类型为整数时编译。

有人可以帮忙吗?

编辑(来自输出的更完整日志):

c:\program 文件 (x86)\microsoft visual studio 11.0\vc\include\chrono(749):错误 C2679:二进制“+=”:未找到采用“const”类型的右手操作数的运算符 std::chrono::duration<_rep>' (或者没有可接受的 转换)与 [ _Rep=双倍, _Period=std::nano ] c:\program files (x86)\microsoft visual studio 11.0\vc\include\chrono(166): could be 'std::chrono::duration<_rep> &std::chrono::duration<_rep>::operator +=(const std::chrono::duration<_rep> &)' 与 [ _Rep=__int64, _Period=std::nano ] 尝试匹配参数列表 '(std::chrono::nanoseconds, const std::chrono::duration<_rep>)' 与 [ _Rep=双倍, _Period=std::nano ] c:\program files (x86)\microsoft visual studio 11.0\vc\include\thread(164) :参见对函数模板实例化 'xtime std::_To_xtime(const std::chrono::duration<_rep> &)' 用 [ 编译 _Rep=双倍, _Period=std::nano ] c:\dev\projects\revolverx\classes\ticker.h(78) :参见对函数模板实例化的参考 'void std::this_thread::sleep_for(const std::chrono::duration<_rep> &)' 用 [ 编译 _Rep=双倍, _Period=std::nano ]

【问题讨论】:

  • 构建日志中是否还有其他消息?例如,它说明使用了哪些类型以及预期的是什么?请编辑您的问题以包含完整错误日志。
  • @Joachim Pileborg,我的错,问题已更新。希望对您有所帮助。

标签: c++ c++11 compiler-errors type-conversion chrono


【解决方案1】:

Visual Studio 中的&lt;chrono&gt; 已损坏。它不适用于混合类型算术,可以说是one of the main features&lt;chrono&gt;。您会收到此错误,因为其中一侧使用 __int64 nanos,而另一侧使用 double nanos。

我建议要么放弃它以支持真正的 C++ 实现,要么使用 Boost.Chrono。

【讨论】:

  • R. Martinho Fernandes,很高兴听到这个消息!那么在我的情况下该怎么办,改用typedef std::chrono::duration&lt;std::chrono::nanoseconds&gt; tick_interval_type;?顺便问一下,它可以在 XCode 中工作吗?
  • 当我遇到这个问题时我所做的只是切换到 Boost.Chrono,就像这样:github.com/rmartinho/nonius/blob/devel/include/nonius/…。或者,你可以在任何地方添加duration_casts,我猜。
【解决方案2】:

更新:我在这个问题最初发布四年后遇到了这个问题,我已经在 Visual Studio 2015 上对此进行了测试。它现在可以编译了。例如:

#include <iostream>
#include <iomanip>
#include <chrono>

int main()
{
    typedef std::chrono::duration<double, std::ratio<1, 100000000>> tick_interval_type;  // Originally posted line
    tick_interval_type tick {0};
    tick += std::chrono::microseconds(3);
    std::cout << std::setprecision(6) << std::fixed << tick.count();
    return 0;
}

输出:

300.000000

【讨论】:

  • @JHBonarius,好的,3 年 11 个月。我们将四舍五入到四。 :) 更新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2011-07-23
相关资源
最近更新 更多