Подтвердить что ты не робот

Использование static const + const в качестве массива

Я делаю что-то вроде этого

Class.hpp:

 class Class {

 private:
     static const unsigned int arraySize;
     int ar[arraySize+2];
 };

Class.cpp:

#include <Class.hpp>
const unsigned int arraySize = 384;

Компилятор (q ++, компилятор С++ для ОС QNX на основе g++) дает мне error: array bound is not an integer constant при компиляции единицы, включая Class.hpp (не при компиляции Class.cpp).

Почему это не работает? Я знаю, что статический член const может использоваться как привязка к массиву, гарантированный стандартом С++ (см. этот anwser). Но почему компилятор не видит результат static const + const как константу?

4b9b3361

Ответ 1

Это хороший код, который должен был быть принят компилятором:

class Class { 
  const static int arraySize = 384; 
  int ar[arraySize+2]; 
}; 

и если это не так, ваш компилятор сломан.

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

// Class.h
class Class { 
  const static int arraySize;
  int ar[arraySize+2]; // ERROR
}; 

// Class.cpp
const int Class::arraySize = 384;

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

Чтобы избежать таких ошибок, вы можете заменить static const int на enum, например

class Class { 
  enum { arraySize = 384 }; 
  int ar[arraySize+2]; 
}; 

Ответ 2

Я удивлен, что это действительно компилируется на gcc, как говорится в комментарии. Поскольку 384 не находится в файле заголовка, размер Class не известен другим единицам компиляции. В некоторых единицах компиляции это может быть неважно, в зависимости от того, как/если они используют Class, но я не могу представить эту компиляцию:

// this is a source file called, say, blah.cpp
#include <Class.hpp>

void someFunc()
{
    void *mem = malloc(sizeof(Class));  // size is not known, so this can't compile

    // do something with mem
}

Вы должны иметь в своем .hpp:

class Class {

 private:
     static const unsigned int arraySize = 384;
     int ar[arraySize+2];
 };

.. как есть в OP, который вы ссылаетесь на здесь.