【发布时间】: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<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> 协变。
这里有什么问题,有没有办法让这个重载的成员函数返回我想要的?
【问题讨论】:
-
不,它们都需要是引用或指针才能协变。
-
有没有办法让它返回一个指向该类型的非指针,或者这是我修复错误的唯一方法?
-
我会说这是在不重新设计的情况下修复错误的唯一 clean 方法。
标签: c++ templates inheritance overloading member