[steady_clock :: now()返回类型对于gcc无效

问题描述 投票:1回答:1

我有以下代码:

#include <chrono>

struct SteadyTime : std::chrono::steady_clock::time_point {
    using time_point::time_point;

    static SteadyTime now() {
      return clock::now();
    }
};

这在Visual Studio 2019上很好用,但在gcc 8.3上出现以下错误:

<source>: In static member function 'static SteadyTime SteadyTime::now()':

<source>:7:24: error: could not convert 'std::chrono::_V2::steady_clock::now()' from 'std::chrono::_V2::steady_clock::time_point' {aka 'std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >'} to 'SteadyTime'

       return clock::now();

              ~~~~~~~~~~^~

Compiler returned: 1

此代码似乎是标准的,所以可能出什么问题了?

c++ c++17 visual-studio-2019 gcc8
1个回答
0
投票

您实际上想做的是这样:

struct Base
{};

Base getBase();

struct Derived : Base
{
    static Derived get() { return getBase(); }
};

https://godbolt.org/z/KZyP99

这不起作用,因为编译器不知道如何将Base转换为Derived。您可以从Derived添加Base的构造函数来解决此问题。

不过,我会质疑总体设计。从std设施继承通常是设计缺陷/弱点。优先考虑组成而不是继承(如果要从中获得的东西不是多态的,则尤其是)。如果需要,请让SteadyTime公开一个time_point成员,或手动包装其接口。在同一继承层次结构中拥有并使用多个具体的(即非抽象的)类很快会导致对象切片和其他UB等混乱,并给用户带来普遍困惑。

© www.soinside.com 2019 - 2024. All rights reserved.