2012-04-12 59 views
-3

(*我用我的陣列結構,並且它必須是動態)模板 - 類對象 - 類的結構對象

我想Array結構來填充Expe類對象。我使用模板,但不知何故,我的結構頭不識別我創建的模板。

Struct標頭:

template <class T>; 
struct Arr{ 
    int days; 
    T * M; 
}; 
typedef Arr* Array; 

結構CPP:

void constr(Array &o){ 
    //Construct of 31*1 Matrix 
    o=new Arr; 
    o->days = 31; 
    o->M = new T[o->days]; 

應該沒事我想,但我得到的錯誤:

..\ListStruc.cpp:26:13: error: expected type-specifier before 'T' 
+0

包含代碼的問題的另外90%在哪裏? – Jon 2012-04-12 13:14:54

+0

補充,我按錯誤輸入... – 2012-04-12 13:16:28

+0

我不知道這些是否與問題有關(我不能彌補問題的正面或反面)但我相信他們會有所幫助:[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021),[三條規則是什麼?](http://stackoverflow.com/questions/4172722)和[爲什麼使用'new'導致C++內存泄漏?](http://stackoverflow.com/questions/8839943/why-does-the-use-of-new-cause-memory-leaks-in-c/ 8840302) – 2012-04-12 13:19:52

回答

1

你有template<class T>之間的分號struct Arr,它不屬於那裏。因此,將其更改爲

template <class T> struct Arr{ int days; T * M; }; 

此外Arr是一個模板,因此,你不能的typedef Arr*Array,只有Arr<someConcreteType>*

末模板函數必須在頭實現,正如你提到的typedef不工作所以把constr一個頭並將其更改爲:

template<class T> void constr(Arr<T>*& o){ 
    o=new Arr<T>; 
    o->days = 31; 
    o->M = new T[o->days]; 

可能有其他的問題,但這是我能從這個問題中看到什麼。

當然,除了彙編(違反the rule of three和缺乏異常安全性)之外,代碼存在問題。

+0

我認爲這裏有一個清晰的具體類,'Expe',所以你可以寫'typedef Arr * Array'。這將允許你在.cpp文件中編寫'const(Array&o){...}'(即非模板化),但是當然你需要'o-> M = new Expe [o-> days ];' – MSalters 2012-10-01 14:57:03

0

您必須刪除結構聲明中的分號。 另外,當您創建此類型的對象時,您必須指定模板類名稱。 而且你不能把指針放入參考。 事實上,你不能把任何東西放在引用中,它們是常量。使用指針而不是引用作爲構造函數參數。

+0

引用最明顯不是常量。該模板沒有實例化,但是除此之外,將指針放在引用中工作正常,所以'Arr *&'是完全有效的代碼,可以用作OP的要求。在這一點上使用指針(指向一個指針)的唯一原因是爲了使它更清晰,但它完全是一個偏好問題而不是必要性問題。 – Grizzly 2012-04-12 13:33:16