2011-11-03 113 views
1

我想建立一個模板,讓我使用一個可調整大小的數組。有沒有辦法找到sizeof(T)?我使用的是malloc而不是new,因爲我想在調整數組大小的函數中使用realloc。這是我的類的構造函數是得到錯誤:在C++中創建模板時可以找到sizeof(T)嗎?

template <class T> 
set<T>::set(void) { 
arr = malloc(10 * sizeof(T)); 
numElts = 0; 
size = 10; 
}; 

我得到試圖建立在以下錯誤消息:

error C2440: '=' : cannot convert from 'void *' to 'int *' 
1>   Conversion from 'void*' to pointer to non-'void' requires an explicit cast 
1>   c:\set.cpp(42) : while compiling class template member function 'set<T>::set(void)' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 

在我與調用它的主要功能:

set<int> *set1 = new set<int>(); 

從我所做的研究看來,編譯器無法知道sizeof(T)如何使用,因此無法編譯。我還會怎麼做呢?

+4

請記住,你的'set'只能使用POD類型。 –

+5

錯誤*清楚*狀態「無法從'void *'轉換爲'int *'」,甚至繼續建議您需要顯式強制轉換將其關閉。顯然,問題是它不知道'sizeof(T)'是什麼。 –

+0

*它看起來像編譯器無法知道sizeof(T)*使用什麼* - 當然它確實;模板實現都是在編譯時執行的。錯誤信息很明顯;你需要施放malloc的結果。至於你爲什麼使用malloc ...不知道。 malloc不會爲你調用構造函數。 –

回答

13

malloc返回void*,並且當將被分配Ç允許不兼容的指針,C++沒有。假設arr被定義爲T*,您需要投射到T* malloc的結果。

arr = static_cast< T* >(malloc(10 * sizeof(T))); 

有在模板內調用sizeof(T),只要T沒有問題的完成在實例化點(和int是一個基本類型,它總是完成)。

+2

工作代碼:'arr = static_cast (malloc(10 * sizeof(T)));' – Pubby

+0

謝謝!這照顧了它。也感謝您解釋C和C++之間的差異。 – Dom12

+0

如果您以慣用的方式使用'malloc',則實際上並不需要任何強制轉換,因爲您將使用生成的void指針作爲放置位置新參數的參數。投射是程序員的一部分醜陋的快捷方式的一個症狀,它假定了該類型的POD。 –

1

我認爲你是過度分析問題。它只是告訴你,你需要將malloc返回的void*轉換爲T*類型的arr

1

當然可以。這不是你遇到錯誤的原因。我想set::arr成員的類型是T*。由於您使用模板參數類型int實例化了set類,因此該成員變量的聲明變爲int *arr;。 C++,不像C,不允許你隱式地從void *轉換到另一個指針類型。所以你需要投下malloc電話的結果。

arr = static_cast<T *>(malloc(10 * sizeof(T))); 

此外,請記住,當你實際插入的元素進入設置你需要使用放置新構造元素融入到緩衝區你分配,然後顯式調用析構函數時複製/移動/移除它們。

+1

據推測,目的不是空的'set'有10個元素,而是要有10個元素的*空格*,只要他在插入時正確地構造對象,所有東西都保持潔淨。當然,鑑於手頭的問題,發生這種情況的可能性很小。 –

+1

此外,'realloc'_can_擴展現有內存(有時)並自動複製數據。所以有利於realloc。特別是在使用POD時。 –

+0

@DennisZickefoose是的,你說得對。我將'numElts = 0;'讀作'numElts = 10;'。我已經更新了答案。 – Praetorian

相關問題