C ++通过模板传递双数组

时间:2018-02-21 09:23:40

标签: c++ function multidimensional-array arguments

我正在将一些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。

1 个答案:

答案 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]) {
显然,我们可以通过删除一些传递的参数来进一步改进这一点,因为它们与模板参数相同...