C++ 关于模板函数
我有一个关于模板函数的问题。这是我第一次使用模板。我可能缺乏一些基础。我对应该使用的变量类型感到困惑。模板后面的int N是什么意思?我认为N是一个灵活的整数。[N][N]是二维数组变量还是指针?b[N]呢?我有一个例子,使用所有输入作为非指针输入。但是Xcode的提示告诉我所有变量都是指针。 这是提示 “LUsolve(double(*A)[N],常数double*b,double*x)”。但我尝试了我的指针变量,没有工作。 函数LUfactorize和LUsolve_internal也是模板函数。太长了。我不会发布所有代码C++ 关于模板函数,c++,templates,C++,Templates,我有一个关于模板函数的问题。这是我第一次使用模板。我可能缺乏一些基础。我对应该使用的变量类型感到困惑。模板后面的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没有提到任何关于无法转换参数的内容吗?阅读整个错误.谢谢你的回答。