使用特定模板值重载继承的类

时间:2014-06-20 07:44:15

标签: c++ templates inheritance overloading member

因此,我知道使用模板的类,您可以在成员函数中返回具有特定模板类型的相同类型的类,例如:

template <typename T>
struct f {

    T val;

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

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

};

这样,我可以

f<int>::GetVal()

返回f<float>

类型

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

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

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

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

};

如果我用T替换返回部分中的浮子,那么它可以正常工作,如预期的那样。但是当我使用f2<float>返回类型时,它会给出错误

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

但我希望f2<float>f<float>协变一致。

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

1 个答案:

答案 0 :(得分:0)

不确定您尝试实现的目标,但也许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) {};
};