我正在将一些 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。
最佳答案
正如@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]) {
显然,我们可以通过删除一些传递的参数来进一步改进这一点,因为它们与模板参数相同...
关于C++通过模板传递双数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48902186/