我正在将一些C代码转换为C ++,以便我可以使用一些更高级的C ++特性。但是,在一个特定的函数中,我遇到了一个问题,因为C语言中允许使用语法,而C ++则不允许。具体来说,以下是有效的C代码,但不是C ++:
void get_xu_col(int i_start,
int n,
double x[n],
int n_x,
int n_u,
int n_col,
double xu_col[n_col][n_x + n_u]) {
...
}
感谢answers here,我知道这是有效的C,但不是C ++。 但是,我想在C ++中模拟这种行为,我不确定这样做的最佳方法。具体来说,我不想传递指针,因为我想对尺寸进行编译时检查,(如果我错了,请更正我)C给了我。
我在很多地方看到的最有希望的解决方案是切换到模板方法。例如,
template<size_t a, size_t b>
void get_xu_col(int i_start,
int n,
double x[n],
int n_x,
int n_u,
int n_col,
double (&xu_col)[a][b]) {
然而,这无法用令人费解的错误编译:
error: no matching function for call to 'get_xu_col'
get_xu_col(id, n_vars, x, n_x, n_u, n_col, xu_col);
^~~~~~~~~~
note: candidate template ignored: could not match 'double' against 'double'
在C和C ++版本中,我这样调用这个代码:
int main(){
...
double xu_col[n_col][n_x + n_u];
get_xu_col( ..., xu_col );
...
}
有人可以告诉我该错误消息试图说什么吗?或者有更好的成语吗?
我无法使用标准库或Boost。
答案 0 :(得分:1)
正如@StoryTeller指出的那样,问题是我忘记了传递的另一个数组的模板参数。我应该编写像
这样的模板template<size_t a, size_t b, size_t c>
void get_xu_col(int i_start,
int n,
double (&x)[c],
int n_x,
int n_u,
int n_col,
double (&xu_col)[a][b]) {
显然,我们可以通过删除一些传递的参数来进一步改进这一点,因为它们与模板参数相同...