[英]Passing a vector to a template function
這是我嘗試編寫的一個小函數,以跟蹤我在函數中使用的動態分配(一直以來都編寫delete []感到厭倦)。
template <class T>
T* snew(int size, vector<T*> list)
{
T* pointer = new T[size];
list.push_back(pointer);
return pointer;
}
vector<float*> list;
float* myfloat1 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat2 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat3 = snew<float*>(HEIGHT*WIDTH,list);
因此,當我需要清除內存時,可以使用:
template <class T>
void sdelete(vector<T*> list)
{
vector<T*>::iterator it;
for (it = list.begin(); it != list.end(); ++it){
delete [] *it
*it = NULL
}
}
像這樣:
sdelete<float*>(list);
當我嘗試編譯時,我得到:
cannot convert parameter 2 from 'std::vector<_Ty>' to 'std::vector<_Ty,_Ax>'
不知道這意味着什么。 感謝您的見解:)
首先,您要按值傳遞vector<T*> list
,這意味着它將被復制並且全局list
保持不變。
像這樣做:
template <class T>
T* snew(int size, vector<T*>& list)
至於編譯問題,有一個錯字,您正在應用*
太多次,將用法更改為
float* myfloat1 = snew<float>(HEIGHT*WIDTH,list);
sdelete<float>(list);
或者,您甚至可以依靠編譯器的類型推斷,然后編寫
float* myfloat1 = snew(HEIGHT*WIDTH,list);
sdelete(list);
但是,從整體上來說,這是一個糟糕的主意,因為如果您已經有了一個vector
,您就不想手工進行new/delete
。 只需創建一個vector<float> x(HEIGHT*WIDTH);
並使用它,它會被自動刪除。
采用
snew<float>(HEIGHT*WIDTH,list);
甚至更好
snew(HEIGHT*WIDTH,list);
確實,模板參數snew
是T
,並且您傳遞了vector<T*>
。 要匹配vector<float*>
,必須傳遞float
。
但是,在調用函數模板時,可以推導出參數,因此根本不需要放置<float>
。
但是,我能給您的最好建議是忘記所有這些,並使用vector<vector<float>>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.