我对模板功能有疑问。这是我第一次使用模板。我可能缺乏一些基础。我对我应该使用的变量类型感到困惑。模板后的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.
答案 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
。
为什么可以在示例中使用数组?
因为数组隐含地衰减到指向第一个元素的指针。