2013-05-06 64 views
1

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

如何设计获得()来能够返回一个用作数据成员的通用对象吗?我试图templatize数据类型测试

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() 

如何修复代码?感谢您的帮助...

类层次表示错误处理的一个非常简单的示例。派生类的所有得到()方法返回错误对象:变量,向量,矩阵等...

例如类B表示变量,C类的矩阵..

更新问题:

很抱歉,但我在同一时间做更多的事情......我不认识

template <typename Data> 
class C : public B <typename Data::Type> 
{ 

集合A的返回类型,B翻番和C必须得双倍返还。正确的版本是

template <typename Data> 
class C : public A <Data> 
{ 
private: Data c; 

public: virtual Data get() {return c;} 
}; 
+3

从上面的代码我不能告诉你想要做什么。但通过将'virtual Data get(){return c;}'行更改为'virtual typename Data :: Type get(){return c.data;}'将使编译顺利进行。 – silvesthu 2013-05-06 20:07:05

+0

@ silvesthu:它将用于错误处理。 get()函数返回引起异常的对象。 – justik 2013-05-06 20:18:49

+0

好的。我仍然不清楚Data和Data :: Type的关系。但至少如果'class C:public B ',get()函数应该返回一个'Data :: Type'对象。 – silvesthu 2013-05-06 20:31:33

回答

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

iee既然你实例化BData::Type(这是double),get()C也必须返回Data::Type,而不仅仅是Data(这将是Test<double>)。