关于模板功能

时间:2017-07-17 15:11:13

标签: c++ templates

我对模板功能有疑问。这是我第一次使用模板。我可能缺乏一些基础。我对我应该使用的变量类型感到困惑。模板后的int N是什么意思?我认为N是一个灵活的整数。是[N] [N] 2d数组变量还是指针?那么b [N]呢?我有一个使用所有输入作为非指针输入的示例。但是来自Xcode的提示告诉我所有变量都是指针。  这是提示 " LUsolve(double(* A)[N],const double * b,double * x)"。但我尝试了我的指针变量,而不是工作。 函数LUfactorize和LUsolve_internal也是模板函数。太长了。我没有发布所有代码。

template < int N >
bool LUsolve( double A[N][N],  const double b[N],  double x[N]  ) 
{ 
  double B[N][N]; 
  int i, j, p[N], status;
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      B[i][j] = A[i][j];
    }
  }
  status = LUfactorize(B, p); 
  if (status != 0) 
  {
   printf("Failed in the LU factorization.\n"); 
   return false;
  }
  LUsolve_internal(B, p, b, x);
  return true;
}


template <int N>
int LUfactorize(double A[N][N], int p[N])

template <int N>
void LUsolve_internal(double A[N][N], const int p[N],
                  const double b[N], double x[N])

这是我工作的例子。错误是&#34;没有匹配函数来调用&#39; LUsolve&#39;&#34;。我该如何解决?

bool cubicspline (double const *knots , double const *knots_value, 
double *coef, int const N)
{

  double x_i = 0;
  double x_Km1 = 0;
  double x_K = 0;
  double d_i = 0;
  double d_Km1 = 0;
  double A [N][N];

  for ( int i = 0; i < N; i++)
  {
    A[i][0] = 1;
    A[i][1] = knots[i];
    for ( int j = 2; j < N; j++)
    {
      x_i = ( (knots[i] > knots[j-2]) ? (knots[i] - knots[j-2]) : 0 );
      x_Km1 = ( (knots[i] > knots [N-2]) ? (knots[i] - knots[N-2]) : 0 );
      x_K = ( (knots[i] > knots [N-1]) ? (knots[i] - knots[N-1]) : 0 );
      d_i = (x_i * x_i * x_i - x_K * x_K * x_K) / ( knots[N-1] -     knots[j-2] );
      d_Km1 = ( x_Km1 * x_Km1 * x_Km1 - x_K * x_K * x_K) / ( knots[N-1] - knots[N-2] );
      A[i][j] = d_i - d_Km1;
    }
   }

bool status = LUsolve( A , knots_value, coef); // Here is the error.

2 个答案:

答案 0 :(得分:0)

在某种意义上说template< int N >意味着N是函数的另一个参数 - 它就像一个普通变量。最大的区别是它必须在编译时指定。当你不能正常声明由变量确定的大小数组时,这允许你声明固定大小N的数组 - 它在这里工作的唯一原因是因为N在编译时是已知的,所以它就像写int x[5]一样“。”

有关类似问题,请参阅here,以及有关模板元编程的链接维基百科文章,以便更好地了解编译时性质。

如果如你所说,这是你第一次使用模板,你可能应该从更多“普通”用例(作为通用参数)开始,以便在使用它们之前了解它们的编译时间。

答案 1 :(得分:0)

  

关于模板功能

这是一个功能模板。通过实例化函数模板获得模板函数。

  

模板后int N的含义是什么?

它是(非类型)模板参数。实例化模板时,必须提供模板参数的值(以及模板没有的模板类型参数的类型) - 显式或由编译器从非模板参数推断出来)

  

A[N][N] 2d数组变量还是指针?

这是一个指针。但只是因为它是一个函数参数。如果它是一个不是函数参数的数组声明,那么它就是一个数组变量。

你不能通过值将数组传递给函数,并且数组参数声明是偷偷摸摸的(在我看来很容易混淆)用指针替换。该类型实际上是double (*A)[N],即指向N数组的指针。

  

这是我说的例子。输入不是指针。

如上所述,您的输入确实是指针。函数参数const double p[2]实际上意味着double const *p

  

为什么可以在示例中使用数组?

因为数组隐含地衰减到指向第一个元素的指针。