因此,我知道使用模板的类,您可以在成员函数中返回具有特定模板类型的相同类型的类,例如:
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>
协变一致。
这里有什么问题,有没有办法让这个重载的成员函数返回我想要的东西?
答案 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) {};
};