将向量传递给模板函数

时间:2011-07-29 14:37:21

标签: c++ templates vector

这是一个小函数,我正在尝试编写以跟踪我在函数中使用的动态分配(厌倦了一直编写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>'

不确定这意味着什么。感谢您的见解:)

2 个答案:

答案 0 :(得分:6)

首先,您按值传递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);并使用它,它就会自动删除。

答案 1 :(得分:0)

使用

snew<float>(HEIGHT*WIDTH,list);

或更好,简单

snew(HEIGHT*WIDTH,list);

实际上,模板参数snewT,您传递vector<T*>。要匹配vector<float*>,您必须通过float

但是,在调用函数模板时,可以推导出参数,因此您根本不需要放置<float>

但是,我能给你的最好建议是忘掉所有这些并使用vector<vector<float>>