Ошибка C ++ с использованием sizeof (T) в статическом члене T - PullRequest
0 голосов
/ 30 июня 2018

Почему мой компилятор не позволяет этого?

class Resource
{
   private:
      static const int max_instances = 10;

      // set aside memory to be used later with placement new
      static char memory[max_instances * sizeof(Resource)]; // error: invalid application of 'sizeof' to incomplete type 'Resource'
};

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

[expr.sizeof] / 1

Оператор sizeof не должен применяться к выражению, имеющему функцию или неполный тип

[class.mem] / 6 , акцент шахты:

Класс считается полностью определенным типом объекта ([basic.types]) (или завершенным типом) при закрытии } спецификатора класса . В пределах класса спецификация члена класс рассматривается как завершенный в теле функции, аргументах по умолчанию, спецификатор noexcept s и инициализаторах членов по умолчанию (включая такие вещи во вложенных классах). В противном случае он считается неполным в своем собственном классе спецификация члена .

0 голосов
/ 30 июня 2018

Мой старый рецепт, оберните его в функцию:

class Resource{
    //...
    auto constexpr max_instances=10;

    static auto& memory(){
        static std::aligned_storage<sizeof(Resource),alignof(Resource)> storage[max_instances];
        return storage;
    };
};
0 голосов
/ 30 июня 2018

Я думаю, это потому, что вы еще не закончили определение своего класса, следовательно, complier не знает, сколько он имеет, и, таким образом, выдает эту ошибку. Я понятия не имею, что вы пытаетесь сделать здесь, воспользуйтесь ответом Ашеплера и определите статический константный символ вне фактического определения класса

...