Как я могу инициализировать в классе константу с плавающей точкой? - PullRequest
2 голосов
/ 03 февраля 2012

Я недавно столкнулся с Visual C ++ 2005, не в состоянии инициализировать в константах класса, столкнулся с вездесущей ошибкой

"ошибка C2864: ...: внутри класса могут быть инициализированы только статические интегральные члены-данные const"

из кода, аналогичного

class MyClass:
{
private:
   static const double myConstant = 2.9768;
}

Мне удалось выяснить, что нецелочисленные типы являются проблемой, и есть несколько способов иметь целочисленные константы, но я не нашел удовлетворительного обходного пути для определения констант, ограниченных областью действия для класса. Является ли этот тип декларации законным в последующих / других компиляторах?

Ответы [ 3 ]

8 голосов
/ 03 февраля 2012

В C ++ 03 вы должны инициализировать нецелые статические константы вне определения класса:

struct Foo
{
    static const double value;
};
const double Foo::value = 0.5;

В C ++ 11 вы можете инициализировать произвольные constexpr выражения из константных выражений inline:

struct Foo
{
    static constexpr double value = 0.5;
};

Вы можете, а может и не обязаны предоставлять определение для переменной, в зависимости от того, требуется ли она где-либо еще в вашем коде (например, взяв ее адрес).

4 голосов
/ 03 февраля 2012

Сделайте это вне определения класса, в исходном файле (не в заголовке, или вы рискуете ошибками компоновщика).

const double MyClass::myConstant = ..;

Такое поведение предписано стандартом языка C ++. Нет юридического решения.

1 голос
/ 03 февраля 2012

Возьмите инициализацию из файла заголовка и поместите это в ваш .cpp:

const double MyClass::myConstant = 2.9768;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...