Использование статического const + const в качестве границы массива - PullRequest
13 голосов
/ 20 января 2012

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

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 ++, компилятор c ++для ОС QNX, основанной на g ++), дает мне error: array bound is not an integer constant при компиляции модуля, включая Class.hpp (не при компиляции Class.cpp).

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

Ответы [ 2 ]

13 голосов
/ 20 января 2012

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

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 голосов
/ 20 января 2012

Я удивлен, что на самом деле это компилируется в 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 вы ссылаетесь на здесь .

...