, что также позволяет сделать это в C ++ 98:

ли причина, по которой кодовые блоки говорят мне, что я не могу создать массив? Я просто пытаюсь сделать:

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

и это дает мне

ошибка: заключенный в фигурные скобки инициализатор не разрешен здесь до токена '{'

Я изменил другие части инициализатора, но ошибка всегда говорит об одном и том же. Это, кажется, не имеет смысла, так как это одна из первых вещей, которые я изучил в c ++.

 hotdiggadydang17 мая 2011 г., 22:12
это в классе, частная переменная
 Cat Plus Plus17 мая 2011 г., 22:09
Нам нужен контекст, в котором это появляется (окружающий код).
 Robᵩ17 мая 2011 г., 22:09
Эта строка в отдельности компилируется просто отлично. Пожалуйста, создайте короткий, автономный, полный пример (sscce.org). Без большего контекста мы не можем сказать вам, что не так.
 Marius Bancila17 мая 2011 г., 22:10
где вы поместили это в свой код? это член класса / структуры? и что это за компилятор?
 Lightness Races in Orbit17 мая 2011 г., 22:18
@hotdiggadydang: Это не обязательно должна быть целая программа. Это должно быть полным,минимальный тестовый пример, который показывает проблему. Посмотрите фрагменты кода в моем ответе для идеальных примеров тестовых случаев. Они демонстрируют вашу проблему, но всего четыре / пять строк, а не сотни. И пусть это будет уроком, что единственная строка кода без контекстане достаточно!

Ответы на вопрос(2)

Напомним, что (на данный момент) переменные-членыне может быть инициализирован там же, где вы их объявляете (за несколькими исключениями).

struct T {
   std::string str = "lol";
};

не в порядке. Должно быть:

struct T {
   std::string str;
   T() : str("lol") {}
};

Но, чтобы добавить оскорбление к травме, до C ++ 0x вы не можете инициализировать массивы вctor-initializer:

struct T {
   const unsigned int array[10];
   T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :(
};

И, потому что элементы вашего массиваconstВы также не можете полагаться на назначение:

struct T {
   const unsigned int array[10];
   T() {
       for (int i = 0; i < 10; i++)
          array[i] = i; // not possible :(
   }
};

Однако, как справедливо отметили некоторые другие участники, кажется, что нет смысла иметь копию массива для каждого экземпляраT если вы не можете изменить его элементы. Вместо этого вы можете использоватьstatic член.

Таким образом, следующее в конечном итоге решит вашу проблему наилучшим образом:

struct T {
   static const unsigned int array[10];
};

const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};

Надеюсь это поможет.

 Cubbi17 мая 2011 г., 23:28
Может помочь упомянуть, что фрагмент «полагаться на назначение» не может быть скомпилирован.
 hotdiggadydang17 мая 2011 г., 22:17
ох .... лол. я забыл об этом
 zeFree15 апр. 2013 г., 19:33
Отличный ответ! Приятно, что вы объяснили все сценарии. +1 за это. :)
 Chris Frederick17 мая 2011 г., 22:26
Конечно, вы должны иметь возможность инициализировать массив после класса, если вы используете статическую переменную-член.
 Lightness Races in Orbit17 мая 2011 г., 22:27
@Christopher: Технически говоря, это не происходит ни «до», ни «после» класса: P

это действительно не разрешено в C ++ 03.

C ++ 0x, частично поддерживаемый многими современными компиляторами, позволяет компилировать следующее:

class C
{
    const unsigned int ARRAY[10];
 public:
    C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {}
};
int main()
{
    C obj; // contains a non-static const member: non-assignable 
}

Однако нестатические члены const имеют смысл, только если они содержатразные значения в разных экземплярах класса. Если каждый экземпляр должен содержать одно и то же{0,1,2,3,4,5,6,7,8,9}, тогда ты должен сделать этоstatic, что также позволяет сделать это в C ++ 98:

class C
{
    static const unsigned int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
    C obj;
}

Ваш ответ на вопрос