我对c ++不是很好,并且想知道为什么数组内部的数组会发生错误,但是对于普通数组(以及如何修复它)可以正常工作。
继承代码(只是在构造它时尝试在类中存储数组):
class foo {
int* stored;
public:
foo(int* ptr) {
stored = ptr;
}
};
int main() {
int arr[][2] = {{1,4},{5,7},{2,5}};
foo obj(arr);
}
当数组类似于int arr[] = {1,2,3}
时,它可以正常工作,但正常的代码会给我这个错误:
error: no matching function for call to 'foo::foo(int [3][2])'
我搜索了一会儿,但我不知道首先要搜索什么,这就是为什么我在这里问(但我觉得它与指针有关)。谢谢你的帮助。
答案 0 :(得分:1)
您尝试将整数数组数组作为单个整数指针传递,这将无效。虽然数组在传递时会衰减到指针,但是数组数组不能是单个指针,也不能是指向指针的指针。
但它可以用作指向数组的指针:
class foo
{
int (*stored)[2];
public:
foo(int (*ptr)[2]) : stored(ptr) {}
};
声明中的括号是必需的,否则它将是一个指针数组。
但是,我建议不要使用原始数组,然后转移到std::vector
或std::array
,这当然可以嵌套:
std::vector<std::array<int, 2>> arr = {
{{ 1, 2 }},
{{ 3, 4 }}
};
答案 1 :(得分:1)
首先,您的代码(即使它有效)也不会存储数组。在你的类中,你有一个指针,所以你所存储的只是一个指向数组的指针。重要的是要清楚地了解这些区别。
您必须声明一个与您尝试“存储”的数组兼容的指针。该指针是int (*stored)[2]
,它是指向两个整数数组的指针。
其实非常简单
int* is compatible with int[]
int (*)[N] is compatible with int[][N]
int (*)[N][M] is compatible with int[][N][M]
等。但是括号确实让人困惑。它们是必需的,因为*
运算符的优先级低于[]
运算符。