Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图从时间点(C+;+;)减去std::chrono::duration,但我的代码不是';t编译。有什么建议吗?_C++_Time_Duration_Chrono - Fatal编程技术网

C++ 试图从时间点(C+;+;)减去std::chrono::duration,但我的代码不是';t编译。有什么建议吗?

C++ 试图从时间点(C+;+;)减去std::chrono::duration,但我的代码不是';t编译。有什么建议吗?,c++,time,duration,chrono,C++,Time,Duration,Chrono,我昨天问了这个问题,但是我的线程被关闭了,所以我在空谈。所以,我的代码没有编译,但我非常希望它能够编译。以下是我的片段: float numSeconds = 50; std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now(); auto duration = std::chrono::duration<float, std::chrono::seconds>(numSecond

我昨天问了这个问题,但是我的线程被关闭了,所以我在空谈。所以,我的代码没有编译,但我非常希望它能够编译。以下是我的片段:

float numSeconds = 50;
std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
auto duration = std::chrono::duration<float, std::chrono::seconds>(numSeconds);
startTime -= duration;
我得到以下错误代码:

Error   C2679   binary '=': no operator found which takes a right-hand operand of type 'std::chrono::time_point<std::chrono::steady_clock,std::chrono::duration<float,std::ratio<1,1000000000>>>' (or there is no acceptable conversion)
错误C2679二进制“=”:未找到接受“std::chrono::time_point”类型的右操作数的运算符(或没有可接受的转换)
这些是不兼容的类型吗?我想他们会下决心做同样的事情

float numSeconds = 50;
以下一行:

std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
可以更简洁地写为:

auto startTime = std::chrono::steady_clock::now();
这两种语法是等价的和正确的

无法编译的原因是:

auto duration = std::chrono::duration<float, std::chrono::seconds>(numSeconds);
startTime -= duration;
上面的意思是
duration
具有类型
std::chrono::duration
,表示为
float
,周期为1/1秒。这意味着这只是一个秒的浮点计数

std::ratio
的第二个模板参数默认为1,因此可以简化为:

auto duration = std::chrono::duration<float, std::ratio<1>>(numSeconds);
auto duration = std::chrono::duration<float>(numSeconds);
以下内容无法编译:

auto duration = std::chrono::duration<float, std::chrono::seconds>(numSeconds);
startTime -= duration;
因为
chrono
有一条规则,即浮点表示的值永远不会隐式转换为整数表示的值。这是为了避免将
float
分配给
int
时产生的截断错误

有几种方法可以解决这个问题。例如,您可以将结果存储在基于
浮点的
时间点

auto anotherTime = startTime - duration;
另一个时间
具有类型
std::chrono::time\u点

或者您可以显式地将
持续时间
转换回整数类型:

startTime -= std::chrono::duration_cast<std::chrono::seconds>(duration);
或:

或:


这是一个关于
的1h视频教程,您可能会发现它很有帮助:

不知道全部细节。您指定的持续时间类型似乎与默认的稳定时钟类型不同。应该有一个类型
std::chrono::stable\u clock::duration
。看起来是这样的!但是,
std::chrono::stadible_clock::duration
似乎不是初始化持续时间的有效方法,因此我不确定如何从浮点秒数中获取正确的持续时间类型。我认为问题在于您试图设置/更改模板参数,结果是不兼容的类型。但不管怎样,我现在真的不能帮你。可能,我想我可能只是需要一个明确的演员阵容。正在尝试
auto duration=std::chrono::duration_cast(std::chrono::duration(秒))可能是票证,因为它是编译的。如果它真的做了正确的事情,我会加上这个作为答案。谢谢霍华德,这真是太彻底了!我想这涵盖了我可能遇到的每一个问题。
auto anotherTime = startTime - duration;
startTime -= std::chrono::duration_cast<std::chrono::seconds>(duration);
using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now();
auto duration = 50s;
startTime -= duration;
using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now();
startTime -= 50s;
using namespace std::chrono_literals;
auto startTime = std::chrono::steady_clock::now() - 50s;