статическая константная двойная инициализация в C ++ - PullRequest
0 голосов
/ 08 июня 2018

У меня есть какой-то устаревший код, который я создаю с помощью «новых» компиляторов и сталкиваюсь с некоторыми статическими ошибками двойной инициализации const, которые мне не нужны.Вот что у меня есть:

//header.h

class myclass
{
   private:
      static const double foo = 3.1415;
      static const double bar = 12345.0 * foo;
};

При компиляции этого кода с gcc версии 4.3.3 - я вижу следующую ошибку:

 foo cannot appear in a constant-expression

Я уже опроверг это как не являющийсяфиаско статического порядка инициализации, как я полагаю, внутренние типы данных имеют четко определенный порядок инициализации - особенно, когда они живут в одном классе.В качестве теста я уже пытался static_cast< double > выразить, но это приводит к еще одной ошибке, утверждающей, что в выражениях const допускаются только приведения целочисленных типов.

1 Ответ

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

static члены данных, которые не являются constexpr, могут быть инициализированы непосредственно при их объявлении в определении класса, если они имеют целочисленный тип или тип перечисления.Все остальные типы данных должны иметь отдельное определение в исходном файле и могут быть инициализированы только в этом определении.Поэтому измените определение вашего класса следующим образом:

class myclass
{
   private:
      static const double foo;
      static const double bar;
};

и введите эти определения ровно в один .cpp файл:

const double myclass::foo = 3.1415;
const double myclass::bar = 12345.0 * foo;

Если у вас есть доступ к достаточно современному C ++,у вас есть альтернативный вариант изменения объявлений в классе на constexpr:

class myclass
{
   private:
      static constexpr double foo = 3.1415;
      static constexpr double bar = 12345.0 * foo;
};

Таким образом, они не будут требовать определения в исходном файле, если вы не используете их как объекты вместо значений (например, если вы берете их адрес).Однако GCC 4.3.3 не поддерживает эту часть C ++ 11.

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