C++ 关于模板函数

C++ 关于模板函数,c++,templates,C++,Templates,我有一个关于模板函数的问题。这是我第一次使用模板。我可能缺乏一些基础。我对应该使用的变量类型感到困惑。模板后面的int N是什么意思?我认为N是一个灵活的整数。[N][N]是二维数组变量还是指针?b[N]呢?我有一个例子,使用所有输入作为非指针输入。但是Xcode的提示告诉我所有变量都是指针。 这是提示 “LUsolve(double(*A)[N],常数double*b,double*x)”。但我尝试了我的指针变量,没有工作。 函数LUfactorize和LUsolve_internal也是模板

我有一个关于模板函数的问题。这是我第一次使用模板。我可能缺乏一些基础。我对应该使用的变量类型感到困惑。模板后面的int N是什么意思?我认为N是一个灵活的整数。[N][N]是二维数组变量还是指针?b[N]呢?我有一个例子,使用所有输入作为非指针输入。但是Xcode的提示告诉我所有变量都是指针。 这是提示 “LUsolve(double(*A)[N],常数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])
模板
布尔卢索夫(双A[N][N],常数双b[N],双x[N])
{ 
双B[N][N];
int i,j,p[N],状态;
对于(i=0;i
下面是我正在处理的示例。错误为“调用'LUsolve'时没有匹配的函数”。我怎样才能修好它

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.
bool cubicspline(双常数*节点,双常数*节点值,
双*coef,整数常数N)
{
双x_i=0;
双x_Km1=0;
双x_K=0;
双d_i=0;
双d_Km1=0;
双A[N][N];
对于(int i=0;i结[j-2])?(结[i]-结[j-2]):0);
x_Km1=((结[i]>结[N-2])?(结[i]-结[N-2]):0);
x_K=((结[i]>结[N-1])?(结[i]-结[N-1]):0);
d_i=(x_i*x_i*x_i-x_K*x_K*x_K)/(节[N-1]-节[j-2]);
d_Km1=(x_Km1*x_Km1*x_Km1-x_K*x_K*x_K)/(节[N-1]-节[N-2]);
A[i][j]=d_i-d_Km1;
}
}
bool status=LUsolve(A,knots_值,coef);//这里是错误。

拥有
模板
在某种意义上意味着
N
是函数的另一个参数-它就像一个普通变量。最大的区别是它必须在编译时指定。这允许在无法正常声明大小为de的数组时声明固定大小的数组
N
由变量终止-它在这里工作的唯一原因是编译时已知
N
,因此“就像”编写
intx[5]

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

如果如您所说,这是您第一次使用模板,那么您可能应该从更“正常”的用例(作为泛型参数)开始,以了解它们在编译时是如何工作的,然后再像这样使用它们

关于模板函数

它是一个函数模板。通过实例化函数模板,可以得到一个模板函数

模板后面的
int N
是什么意思

它是一个(非类型)模板参数。在实例化模板时,必须提供模板参数的值(以及模板类型参数的类型,您的模板没有这些参数),可以是显式的,也可以是由编译器从非模板参数推导出的)

是[N][N]
二维数组变量还是指针

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

不能按值将数组传递到函数中,数组参数声明会偷偷地(在我看来也是令人困惑的)替换为指针。该类型实际上是
double(*a)[N]
即指向
N
double数组的指针

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

像上面一样,您的输入实际上是指针。函数参数
const double p[2]
实际上意味着
double const*p


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


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

您的变量名非常混乱,特别是在后面使用相同的小写和大写(请参见
b
b
)。编写几个额外字符所花费的时间将得到无数次的回报,因为您和其他人将节省下来,试图弄清楚您的代码在做什么。该语言不允许在函数参数中传递数组,因此它们都会衰减为指针。B是矩阵,B是线性系统的右侧,例如Bu=B简单:
N
将替换为实例化时提供的整数常量。为什么可以在示例中使用该数组?谢谢你的回答。我已将示例更改为我的示例。你能给出一些建议吗?@Yue编译器没有提到该函数的任何候选项吗?我怀疑你忘记在c之前定义模板了但是,您可以使用对数组的引用,例如
double(&A)[N][N]
@user2079303编译器将候选函数命名为“LUsolve”。第一个函数在LU.h文件中。我的示例在另一个头文件中。我已经包含了LU.h。定义模板是什么意思?在我的示例函数中定义模板?@Yue没有提到任何关于无法转换参数的内容吗?阅读整个错误.谢谢你的回答。