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

如何设计 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;}
};
4

1 回答 1

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(which is double)进行实例化,因此get()inC也必须 return Data::Type,而不仅仅是Data(which would be Test<double>)。

于 2013-05-06T20:34:22.597 回答