1

我有一个这样的程序:

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?

4

2 回答 2

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);}    
于 2014-01-28T11:06:30.773 回答
0

int a[2][3]基本上是一个常量指针。不能分配给常量指针。您只能复制完整内容。如果只需要复制指针,则需要声明指针而不是数组:

class A {
  int (*a)[3];
 public:
  A(int b[2][3]): a(b) {};
};
于 2014-01-28T11:01:54.763 回答