2013-05-06 66 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>)。