std::chrono 在传递变量时不起作用

std::chrono doesn't work if passing a variable

本文关键字:变量 不起作用 chrono std      更新时间:2023-10-16

我遇到了一个std::chrono的奇怪错误,如果我这样做:

TimeHandling time(std::chrono::milliseconds(1000 / 125));
time.start();

一切都很好。但如果我把毫秒值放在一个变量中:

int mpl = 1000 / 125;
TimeHandling time(std::chrono::milliseconds(mpl));
time.start();

g++抛出此错误:

 request for member ‘start’ in ‘time’, which is of non-class type ‘TimeHandling(std::chrono::milliseconds) {aka TimeHandling(std::chrono::duration<long int, std::ratio<1l, 1000l> >)}’

有人知道为什么吗?

第二个版本声明了一个带有参数mpl 的函数

请参阅http://en.wikipedia.org/wiki/Most_vexing_parse和https://stackoverflow.com/tags/most-vexing-parse/info

C++11允许您使用大括号来消除声明中初始化的歧义:

TimeHandling time{std::chrono::milliseconds(mpl)};

或者,对两个初始化都使用大括号:

TimeHandling time{std::chrono::milliseconds{mpl}};

此行

TimeHandling time(std::chrono::milliseconds(mpl));

声明了一个返回TimeHandling对象的函数,并接受一个名为mplstd::chrono::milliseconds参数。

当编译器面临将此类语句视为函数声明或构造函数调用的困境时,(标准)会强制将其视为函数宣言。

使用大括号初始化可以更正此问题并消除语句的歧义。