Использование 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
как константу?
Ответы
Ответ 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, который вы ссылаетесь на здесь.