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.