将“指针指针”传递给模板函数

时间:2016-06-01 07:34:18

标签: c++ function templates pointers

我有一个功能,它将内存分配给指针,如下所示:

   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)。”

2 个答案:

答案 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];
}