C ++无法专门化函数模板

时间:2014-02-14 03:42:58

标签: c++ function templates

我的功能模板有问题。我遇到的错误是:'无法专门化函数模板'T sumfun(T&,size_t)和以下模板参数:coord [3]'。有谁知道如何纠正?我试过'模板coord sumfun(T& ob,size_t ndim)',但它会犯更多错误。

template <class T> T sumfun(T &ob, size_t ndim){
T sum();
  for(size_t i = 0 ; i <= ndim ; i++)
  sum + = ob[i];
  return sum;
};

class coord
{
double *crd;
public:
coord(){crd[0]=0;crd[1]=0;};
coord(double xx, double yy) {
    alloc(); 
    crd[0] = xx; crd[1] = yy;
}
coord & operator + ( const coord &prawy);
private:
void alloc() {
    try {
        crd = new double [2];
    }catch(bad_alloc) {
    }
}
};

coord & coord::operator+(const coord &prawy){
coord tmp(0,0);
tmp.crd[0] = crd[0] + prawy.crd[0];
tmp.crd[1] = crd[1] + prawy.crd[1];
return tmp;
};

int _tmain(int argc, _TCHAR* argv[])
{
coord tab[] = { 
    coord(0, 0), coord(1,2), coord(2, 1) };
coord sum = sumfun(tab, sizeof(tab)/sizeof(coord));
//cout << sum;

system("pause");
return 0;
}

我无法更改主要功能,因此参数必须如下:

coord sum = sumfun(tab,sizeof(tab)/ sizeof(coord));

1 个答案:

答案 0 :(得分:2)

问题是您传递的是数组,但传递数组的语法需要它的大小。幸运的是,你可以让模板扣除为你找出尺寸:

template <class T, std::size_t N> 
T sumfun(const T (&ob)[N])
{
  T sum = T();
  for(std::size_t i = 0 ; i < N ; ++i)
    sum += ob[i];
  return sum;
}

另请注意,T sum()是一个函数声明,这就是我将其更改为T sum = T()的原因。 T sum{};也可以。

修改:如果您无法更改main,请为ndim添加第二个参数。然后,您可以检查此数字是否不大于N

template <class T, std::size_t N> 
T sumfun(const T (&ob)[N], std::size_t ndim)
{
  if (ndim > N)
    // error, raise an exception or something

  T sum = T();
  for(std::size_t i = 0 ; i < ndim; ++i)
    sum += ob[i];
  return sum;
}

当然,您也可以使用std::accumulate,作为一个非常懒惰的程序员,它将是我首选的解决方案:

coord sum = std::accumulate(std::begin(tab), std::end(tab), coord());