我有一个功能,它将内存分配给指针,如下所示:
void initializeImageBuffer(unsigned char **image, int w, int h)
{
if (*image != NULL)
delete[] *image;
*image = new unsigned char[w * h];
}
现在我想使用函数模板推广参数类型(unsigned char / int / double)。多数民众赞成我所做的:
template<typename T, int, int>
void initializeImageBuffer(T **image, int w, int h)
{
if (*image != NULL)
delete[] *image;
*image = new T[w * h];
}
但使用如下函数时出错:
unsigned char* image;
initializeImageBuffer(&image, 200, 200);
“这些参数类型没有重载函数的实例。参数类型是(unsigned char **,int,int)。”
答案 0 :(得分:7)
template<typename T, int, int>
在此声明您的模板有三个参数,类型T
和两个未命名的int
。由于无法在调用站点推断int
s的值,因此您需要明确地提供它们以及T
,因为您只能从左到右提供模板参数:< / p>
initializeImageBuffer<unsigned char, 42, 42>(&image, 200, 200);
然而,你最想要的只是放弃这些int
,它们在这里绝对没用。
template<typename T>
void initializeImageBuffer(T **image, int w, int h)
答案 1 :(得分:4)
您可能会将模板参数与函数参数混淆。模板参数列表中的int, int
在这里是不必要的,并且不能从函数调用中推断出来,这就是编译器抱怨的原因。
删除它们:
template<typename T>
void initializeImageBuffer(T **image, int w, int h)
{
if (*image != NULL)
delete[] *image;
*image = new T[w * h];
}