【问题标题】:Overloading of inherited class with specific template value具有特定模板值的继承类的重载
【发布时间】:2014-08-10 22:05:21
【问题描述】:

所以,我知道对于一个使用模板的类,你可以在成员函数中返回一个与特定模板类型相同类型的类,比如:

template <typename T>
struct f {

    T val;

    f(T val) : val(val) {};

    virtual f<float> GetVal() { return f<float>(val); };

};

这样我就可以拥有了

f<int>::GetVal()

返回f&lt;float&gt;的类型

这工作得很好,直到我尝试对继承的类做同样的事情,例如:

template <typename T>
struct f2 : public f<T> {

    f2(T val) : f(val) {};

    virtual f2<float> GetVal() { return f2<float>(val); };

};

如果我用 T 替换返回部分中的浮点数,那么它可以正常工作,正如预期的那样。但是当我使用f2&lt;float&gt; 返回类型时,它给出了错误

error C2555: 'f2<T>::GetVal': overriding virtual function return type differs and is not covariant from 'f<T>::GetVal'

但我希望 f2&lt;float&gt;f&lt;float&gt; 协变。

这里有什么问题,有没有办法让这个重载的成员函数返回我想要的?

【问题讨论】:

  • 不,它们都需要是引用或指针才能协变。
  • 有没有办法让它返回一个指向该类型的非指针,或者这是我修复错误的唯一方法?
  • 我会说这是在不重新设计的情况下修复错误的唯一 clean 方法。

标签: c++ templates inheritance overloading member


【解决方案1】:

不确定您想要实现什么,但也许CRTP 可以帮助您:

template <typename T, typename Derived>
struct f {
    T val;
    f(T val) : val(val) {};
    Derived<float> GetVal() { return Derived<float>(val); };

};

template <typename T>
struct f2 : public f<T, f2<T>> {
    f2(T val) : f(val) {};
};

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多