Не удается создать выделенный массив из класса с постоянным размером переменной - PullRequest
0 голосов
/ 11 января 2020

Почему этот код не компилируется?

class MyClass
{
    const int size = 5;
    int arr[size];
};

Ошибка говорит о том, что size - необъявленный идентификатор.

Ответы [ 3 ]

6 голосов
/ 11 января 2020

Инициализатор элемента по умолчанию (= 5; в вашем коде) определяет только то, как элемент данных c, не относящийся к состоянию, инициализируется по умолчанию . Конструктор может дать ему другое значение. Таким образом, компилятор не может знать , каким будет его значение во время компиляции.

И, следовательно, вы не можете использовать A::size в выражении константы во время компиляции. Например, когда вы объявляете размер массива.

Если вы хотите, чтобы у каждого A было size из 5, тогда переменная должна быть constexpr static членом. Или, как предлагается в комментарии, a std::array<..., 5>.

4 голосов
/ 11 января 2020

Вам нужно постоянное выражение для размера при объявлении массива.

Создание размера static решит вашу проблему

class MyClass
{
    const static int size = 5;
    int arr[size];
};

Как правило, вы предпочитаете std::array вместо этого, поскольку размер является фиксированным. При желании вы можете включить размер в качестве параметра шаблона.

template <std::size_t N>
class MyClass
{
    std::array<int, N> arr;
};
0 голосов
/ 11 января 2020

Это потому, что size не является статичным c, и вы пытаетесь получить доступ к этой константе "статически" (то есть без объекта).

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