【问题标题】:C++ Failed to specialize function templateC++ 无法专门化函数模板
【发布时间】:2014-02-14 03:42:57
【问题描述】:

我的函数模板有问题。我遇到的错误是:'无法使用以下模板参数专门化函数模板'T sumfun(T &,size_t):coord [3]'。有谁知道如何纠正?我尝试了“模板坐标 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;
}

我不能改变主函数,所以参数必须是这样的:

坐标总和 = sumfun(tab, sizeof(tab)/sizeof(coord));

【问题讨论】:

    标签: c++ function templates


    【解决方案1】:

    问题是你传递的是一个数组,但是传递数组的语法需要它的大小。幸运的是,您可以让模板推演为您计算尺寸:

    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());
    

    【讨论】:

    • 更正了我的模板,但现在我收到此错误“T sumfun(T (&)[N])”:需要 1 个参数 - 提供了 2 个参数”
    • @user3308470 您只需将tab 传递给它。
    • @juanchopanza 你的意思是 sumfun(tab) 吗?但问题是我无法更改主要功能
    • @juanchopanza 并且如果我使用 sumfun(tab) (我不能这样做),错误是'语法错误:'='' in line 'sum + = ob[i];' ..
    • @user3308470 我从您的原始文件中继承了一个错字。你需要sum += ob[i];。至于要求不改main,你什么都没说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多