我有一个这样的程序:
class A {
int a[2][3];
public:
A(int b[2][3]): a(b) {};
};
int main() {
int b[2][3];
A myclass(b);
return 1;
}
编译器说:
1.cpp: In constructor 'A::A(int (*)[3])':
1.cpp:5:22: error: incompatible types in assignment of 'int (*)[3]' to 'int [2][3]'
为什么它们不兼容?如何通过另一个数组b初始化数组A :: a?
答案 0 :(得分:3)
由于历史原因,内置数组类型是相当不方便的二类类型,无法按值复制或传递给函数。相反,他们倾向于腐烂指针;尽管有语法,你的构造函数参数实际上是一个指针,相当于
A(int (*b)[3])
因此错误消息抱怨指针无法分配给数组。
你可以将数组包装在一个类中,使得更方便的可复制类型;在C ++ 11中,标准库已经提供了这样的array
模板:
typedef std::array<std::array<int,2>,3> array;
array a;
A(array const & b) : a(b) {}
如果你真的想坚持使用内置数组,那么你需要通过steam复制数据:
A(int b[2][3]) {std::copy(b, b+3, a);}
答案 1 :(得分:0)
int a[2][3]
基本上是一个常量指针。无法分配常量指针。您只能复制完整内容。如果只需要复制指针,则需要声明指针而不是数组:
class A {
int (*a)[3];
public:
A(int b[2][3]): a(b) {};
};