c – 衍生出奇怪的重复模板和协方差

c – 衍生出奇怪的重复模板和协方差,第1张

概述假设我有一个克隆派生类的基类: class Base{ public: virtual Base * clone() { return new Base(); } // ...}; 我有一组派生类,使用奇怪的重复模板模式实现: template <class T>class CRTP : pub 假设我有一个克隆派生类的基类:
class Base{    public:        virtual Base * clone()        {            return new Base();        }        // ...};

我有一组派生类,使用奇怪的重复模板模式实现:

template <class T>class CRTP : public Base{    public:        virtual T * clone()        {            return new T();        }        // ...};

我试图从这个进一步得出这样的:

class Derived : public CRTP<Derived>{    public:        // ...};

我得到编译错误的效果:

error C2555: 'CRTP<T>::clone': overrIDing virtual function return type differs and is not covariant from 'Base::clone'

我意识到这可能是编译器在实例化CRTP时不完全知道Derived的继承树的结果.此外,用(Base *)替换返回类型(T *)也会编译.但是,我想知道是否有一项工作保留了上述语义.

解决方法 一个不那么漂亮的解决方法.
class Base{    protected:        virtual Base * clone_p()        {            return new Base();        }};template <class T>class CRTP : public Base{    protected:        virtual CRTP* clone_p()        {            return new T;        }    public:        T* clone()        {            CRTP* res = clone_p();            return static_cast<T*>(res);        }};class Derived : public CRTP<Derived>{    public:};

使用dynamic_cast<>如果你觉得它更安全,而不是静态.

总结

以上是内存溢出为你收集整理的c – 衍生出奇怪的重复模板和协方差全部内容,希望文章能够帮你解决c – 衍生出奇怪的重复模板和协方差所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1239172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存