有A类
template <typename T>
class A
{
public: virtual T get() = 0;
};
和两个派生类B,C和get()方法
template <typename T>
class B : public A<T>
{
private: T b;
public: T get() {return b;}
};
template <typename T>
struct Test
{
T data; typedef T Type;
};
如何设计get()以返回用作数据成员的常规对象?我试图模拟数据类型Test
template <typename Data>
class C : public B <typename Data::Type>
{
private: Data c;
public: virtual Data get() {return c;}
};
int main(int argc, char* argv[])
{
C <Test<double>> *c = new C<Test<double>> ();
c->get();
}
但该示例仍无效。将显示以下消息:
Error 1 error C2555: 'C<Data>::get':
overriding virtual function return type differs and
is not covariant from 'B<T>::get()
如何修复代码?谢谢你的帮助...
类层次结构表示错误处理的一个非常简单的示例。派生类的所有get()方法都返回错误对象:变量,向量,矩阵等......
例如,B类代表一个变量,C类代表一个矩阵..
更新了问题:
很抱歉,但我在做同样的事情......我没有认出来
template <typename Data>
class C : public B <typename Data::Type>
{
将A,B的返回类型设置为double,C也必须返回double。正确的版本是
template <typename Data>
class C : public A <Data>
{
private: Data c;
public: virtual Data get() {return c;}
};
答案 0 :(得分:2)
我不完全确定你要做什么,但这至少会编译:
template <typename Data>
class C : public B <typename Data::Type>
{
private: typename Data::Type c;
public: virtual typename Data::Type get() {return c;}
};
使用您的代码,我收到以下错误:
prog.cpp: In instantiation of ‘class C<Test<double> >’:
prog.cpp:30:44: required from here
prog.cpp:25:22: error: conflicting return type specified for ‘Data C<Data>::get()
[with Data = Test<double>]’
prog.cpp:11:12: error: overriding ‘T B<T>::get() [with T = double]’
即。由于您使用B
(Data::Type
)实例化double
,get()
中的C
也必须返回Data::Type
,而不只是Data
1}}(这将是Test<double>
)。