我有以下代码:
#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
此代码似乎是标准的,所以可能出什么问题了?
您实际上想做的是这样:
struct Base
{};
Base getBase();
struct Derived : Base
{
static Derived get() { return getBase(); }
};
这不起作用,因为编译器不知道如何将Base
转换为Derived
。您可以从Derived
添加Base
的构造函数来解决此问题。
不过,我会质疑总体设计。从std
设施继承通常是设计缺陷/弱点。优先考虑组成而不是继承(如果要从中获得的东西不是多态的,则尤其是)。如果需要,请让SteadyTime
公开一个time_point
成员,或手动包装其接口。在同一继承层次结构中拥有并使用多个具体的(即非抽象的)类很快会导致对象切片和其他UB等混乱,并给用户带来普遍困惑。