将向量传递给模板函数

3

我正在尝试编写一个小函数来跟踪我在函数中使用的动态分配(厌倦了一遍又一遍地写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>'

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


如果你想要一个多维数组,可以使用向量的向量或 Boost.MultiArray。 - undefined
5
你考虑过使用智能指针或者标准库容器来完成这个任务吗?在应用程序代码中,你不应该到处写delete,如果你这样做,很可能你的代码不正确,也没有异常安全性。 - undefined
正如@James所提到的,智能指针可能是你需要的。boost::shared_array 是一个不错的选择。 - undefined
@Sander,为什么vector<float>(WIDTH*HEIGHT)不是一个好的容器? - undefined
对于期望接收“float *”参数的函数,你可以传递&vec.front(),其中vec是一个vector<float>。这是可以接受且安全的。 - undefined
显示剩余4条评论
2个回答

7

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


好的,所以向量是一种像其他类型一样的类型,而不是指针,所以如果我想通过引用传递它,我需要使用&符号。;) - undefined
1
请注意,当您阅读并复制编译错误 无法将参数 2 从 'std::vector<_Ty>' 转换为 'std::vector<_Ty,_Ax>' 时,您忘记在其中包含模板参数(这些参数在后面或下一行中指定)。它们会立即揭示给您这个问题! - undefined

0

使用

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

或者更好的是,简单地。
snew(HEIGHT*WIDTH,list);

确实,模板参数snewT,而你传递的是vector<T*>。为了匹配vector<float*>,你必须传递float

然而,在调用函数模板时,参数可以被推断出来,所以你根本不需要写<float>这个东西。

然而,我能给你的最好建议是忘记所有这些,使用vector<vector<float>>


我明白你的意思,因为在我的函数定义中我指定了T,所以在调用时只需要写T,而不需要写T - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接