gpt4 book ai didi

c++ - 具有 CRTP 可克隆类的无效协变类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:47 25 4
gpt4 key购买 nike

我正在尝试使用 CRTP 实现一个可克隆类。但是,我需要有一个抽象类,它有一个纯虚拟克隆方法,被子类覆盖。为了做到这一点,我需要克隆函数返回协变返回类型。我在下面编写了这段代码,编译器对我大喊这个错误:

main.cpp:12:5: error: return type of virtual function 'clone' is not covariant with the return type of the function it overrides ('B *' is not derived from 'AbstractClonable *')

“B”类似乎是 AbstractClonable 的子类,甚至是两种方式!我该如何解决这个问题?非常感谢你。我尝试同时使用 clang 3.6 和 GCC 4.9.2

struct AbstractClonable {
virtual AbstractClonable* clone() const = 0;
};

template<typename T>
struct Clonable : virtual AbstractClonable {
T* clone() const override {
return new T{*dynamic_cast<const T*>(this)};
}
};

struct A : virtual AbstractClonable {

};

struct B : A, Clonable<B> {

};

最佳答案

即使 B确实源自 Clonable<B> ,这里的问题是 Clonable<B>构造无效,因为它定义了

B* clone() const override

这当然不是对 AbstractClonable::clone() 的覆盖,因为编译器看不到 B此时作为 AbstractClonable 的 child .所以我认为问题在于编译器无法构建 Clonable<B>B 基地.

一种解决方法(但与您想要的并不完全相同)是定义

Clonable* clone() const override

Clonable .正如您在评论中提到的,您还可以定义一个自由函数

template<typename T> 
T* clone(const T* object)
{
return static_cast<T*>(object->clone());
}

相关:Derived curiously recurring templates and covariance

关于c++ - 具有 CRTP 可克隆类的无效协变类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com