簡體   English   中英

將向量傳遞給模板函數

[英]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);

確實,模板參數snewT ,並且您傳遞了vector<T*> 要匹配vector<float*> ,必須傳遞float

但是,在調用函數模板時,可以推導出參數,因此根本不需要放置<float>

但是,我能給您的最好建議是忘記所有這些,並使用vector<vector<float>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM