Инициализация двухмерного массива структур в C ++ - PullRequest
2 голосов
/ 19 сентября 2010

Я пытаюсь инициализировать двумерный массив структур в C ++, но получаю ошибку.Может кто-нибудь сказать, пожалуйста, что я делаю не так?Я перепроверил скобки, и они, кажется, в порядке.

Мой код:


struct CornerRotationInfo {
  bool does_breed;
  int breed_slope;
  bool self_inversion;
  int self_slope;
  inline CornerRotationInfo(bool db, int bs, bool si, int ss) : does_breed(db), breed_slope(bs), self_inversion(si), self_slope(ss) {};
};

#define NO false
#define YES true
#define R 1
#define F -1
#define H 0
static const CornerRotationInfo corner_rot_info[3][8] = {
  // { 0, 45, 90, 135
  //  180, 225, 270, 315 }
  {
    { NO, F, NO, F }, {YES, F, NO, H }, {YES, H, NO, R}, {NO, R, YES, R },
    { NO, F, NO, F }, {YES, F, NO, H }, {YES, H, NO, R}, {NO, R, YES, R }
  }, // Falling
  {
    { NO, H, NO, H }, {YES, F, NO, R }, {NO, H, YES, H }, {YES, R, NO, F },
    { NO, H, NO, H }, {YES, F, NO, R }, {NO, H, YES, H }, {YES, R, NO, F }
  }, // Horizontal
  {
    { NO, R, NO, R }, {NO, F, YES, F }, {YES, H, NO, F}, {YES, R, NO, H },
    { NO, R, NO, R }, {NO, F, YES, F }, {YES, H, NO, F}, {YES, R, NO, H }
  }  // Rising
};

#undef NO
#undef YES
#undef R
#undef F
#undef H

Я получаю ошибку:

Transformation.C:72: error: brace-enclosed initializer used to initialize `const
 CornerRotationInfo'

Ответы [ 2 ]

4 голосов
/ 19 сентября 2010

Когда вы пытаетесь использовать агрегатный инициализатор для инициализации массива объектов с помощью используемого объявленного конструктора, синтаксис, который вы можете использовать, существенно зависит от того, сколько параметров имеет конструктор отдельного элемента.

Если конструктор имеет (читай: принимает) только один параметр, вы можете использовать «обычный» синтаксис инициализатора агрегата, как в

std::string a[2] = { "abc", "def" };

Однако, если вы хотите (или хотите иметь конструктор)) для использования требуется более одного параметра, вы не можете передавать аргументы конструктора в виде {} -закрытого списка.У вас нет другого выбора, кроме как явно создать временные объекты целевого типа в агрегатном инициализаторе, как в

std::vector v[2] = { std::vector(10, 3), std::vector(8, 2) };

Это именно то, что вы должны сделать в вашем случае

static const CornerRotationInfo corner_rot_info[3][8] = {
  {
    CornerRotationInfo(NO, F, NO, F), 
    CornerRotationInfo(YES, F, NO, H),
    ...
  },
  ...
};

и т. д.

Обратите внимание, что в C ++ инициализация, выполняемая с помощью {} -приведенного списка инициализаторов, является концептуально copy-initialization , что означает, что вы на самом деле не сильно меняетесь, создаваяэти временные в явном виде.Т.е. концептуально временные объекты всегда создаются во время инициализации агрегата.Компилятор обычно все равно их оптимизирует.

1 голос
/ 19 сентября 2010

Если я понимаю ваше намерение, проблема в том, что вы дали CornerRotationInfo конструктор. Это означает, что это больше не агрегатная структура, и вы не можете использовать обычную агрегатную инициализацию.

Если вы удалите конструктор, ваш инициализатор в скобках должен работать.

(Если, с другой стороны, вы пытаетесь использовать C ++ 0x initializer_list, вы должны прояснить это в своем вопросе.)

...