如何将std::chrono::milliseconds用作默认参数

6

场景
我有一个 C++ 函数,它接受一个参数作为 std::chrono::milliseconds。这基本上是一个超时值,并且它是默认参数,默认情况下设置为某个值。

代码

#include <iostream>
#include <chrono>

void Fun(const std::chrono::milliseconds someTimeout = std::chrono::milliseconds(100)) {
    if (someTimeout > 0) {
        std::cout << "someNumberInMillis is: " << someNumberInMillis.count() << std::endl;
    }
}

int main() {
    unsigned int someValue = 500;
    Fun(std::chrono::milliseconds(someValue))
}

问题
以上的代码都没有问题,但是当我给Fun函数传入一个值时,编译失败并出现以下错误:

无法将'bool'转换为'std::chrono::milliseconds'(也就是'duration>')

问题:
我在哪里出错了?我想让调用Fun的函数明确知道它在调用Fun时使用了std::chrono::milliseconds。但是编译器似乎不允许将std::chrono::milliseconds作为参数使用?

如何将std::chrono::milliseconds作为默认参数使用?

环境
使用的编译器是macOS High Sierra上的clang。


如果(someTimeout> 0),我的编译器找不到匹配的重载。而someNumberInMillis从哪里来?当我修复这些和其他明显的语法错误时,GCC9对我来说编译得很好。 - Toby Speight
我更新了代码,请再次检查。我正在改进变量名称 :-D - AdeleGoldberg
它能够在gcc上编译通过? 太神奇了! 我在macOS上使用clang作为编译器。 我已经在问题中更新了环境细节。 - AdeleGoldberg
正如我所说,我必须修复一些语法错误,包括名称不一致、与整数对比和缺少分号。你能否更新为一个没有任何错误的 [mcve],除了我们感兴趣的那个错误?谢谢! - Toby Speight
1个回答

4

在修复了其他语法错误之后,这段代码在GCC 9中可以无警告编译通过:

#include <iostream>
#include <chrono>

void Fun(const std::chrono::milliseconds someNumberInMillis
                                         = std::chrono::milliseconds(100))
{
    if (someNumberInMillis > std::chrono::milliseconds{0}) {
        std::cout << "someNumberInMillis is: " << someNumberInMillis.count()
                  << std::endl;
    }
}

int main()
{
    unsigned int someValue = 500;
    Fun(std::chrono::milliseconds(someValue));
}

1
非常抱歉。我接受。我犯了不同的错误 :-(。这个问题仍然对于想要了解如何将chrono类型用作参数的新手很有用。感谢您。 - AdeleGoldberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接