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

标签 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。

最佳答案

正如@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/

相关文章:

c++ - 链接到 boost_thread 的问题

JavaScript 'reset' 函数无法正常工作

java - 在两个点之间对角地遍历2D数组

Matlab函数参数传递

c - 求二维数组中指定行和列的最大值 C

JAVA 2D 字符串数组列数

c++ - 处理多个颠覆项目之间的关系

c++ - 在套接字编程中接收结构并写入文件

c++ - 使用 getline() 从文本文件中读入行并将 push_back 读入对象 vector

c# - C# 中如何存在全局函数?