模板,在派生类中返回数据的通用方法

时间:2013-05-06 19:59:00

标签: c++ class templates inheritance methods

有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;}
};

1 个答案:

答案 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]’

即。由于您使用BData::Type)实例化doubleget()中的C也必须返回Data::Type,而不只是Data 1}}(这将是Test<double>)。