Ошибка слишком многих инициализаторов для простого массива в bcc32

Компиляция следующего примера

struct S {};

int main() {
  S array[1] = { S() };
}

с bcc32 я получаю следующую ошибку:

[bcc32 Error] test.cpp(4): E2225 Too many initializers

Это ошибка в BCC32 или я что-то упустил, и приведенный выше пример не является допустимым C++?

И Clang, и GCC компилируют этот пример без проблем.

1 ответ

Решение

Borland BDS2006 (и, возможно, более новые версии)

имеет некоторые проблемы с конструктором / деструктором по умолчанию для class а также struct внутри своего C++ движка.

Добавление собственного (даже пустого) конструктора / деструктора решает многие проблемы, даже ваши. Пытаться:

struct S
    {
    S(){};
    S(S& a){};
    ~S(){};
    S* operator = (const S *a){};
    //S* operator = (const S &a){}; // use this only if you have dynamic allocation members
    };

int main()
    {
    S array[1] = { S() };
    }

Я пробовал это в BDS2006, и похоже, что это работает (трудно сказать, ничего внутри struct) но вы можете скомпилировать и запустить хотя бы...

Сначала я обнаружил такое поведение в BDS2006... на самом деле не пробовал BCB6, так как он с самого начала был бесполезным, и отклонил его через несколько дней (я думаю, что худший BCB, когда-либо даже превосходивший BCB3,4) в BCB5 был в порядке (до BDS2006) это была моя любимая IDE), поэтому они должны были изменить движок C++ (не путать с библиотеками времени выполнения!!!).

Добавление даже пустого конструктора деструктора помогает. Если вы получили динамическое распределение, вам нужно обрабатывать грубые. Если вы получили вложенный класс / структуру, не забудьте также добавить их к ним.

Другие вопросы по тегам