Как определить const double внутри заголовочного файла класса?

Внутри заголовочного файла моего класса я пытаюсь сделать следующее и получаю жалобы компилятора:

private:
    static const double some_double= 1.0;

Как вы должны это сделать?


person zebra    schedule 09.12.2011    source источник
comment
Я думаю, вы не можете поместить это в заголовочный файл. Это нарушило бы правило определения констант только один раз. В соответствии с этим andser на SO: stackoverflow.com/questions/ 2777541/static-const-double-in-c   -  person Ziggy    schedule 09.12.2011
comment
¤ Если вы хотите сделать это целиком в шапке (как указывает вопрос), то есть два основных способа. Первый и самый простой — определить встроенную функцию, которая создает значение или ссылку на значение. Во-вторых, использовать трюк с шаблонной константой, как показано в этом примере со ссылкой. Я считаю прием с шаблонными константами своим, поскольку, за одним исключением, которое произошло несколько лет назад, я единственный, кого я знаю, кто защищал и/или обсуждал его. Однако, если вам не нравится ни одно из решений, просто скомпилируйте отдельно. Ура и чт.,   -  person Cheers and hth. - Alf    schedule 09.12.2011
comment
Поправка: я не знал, что С++ 11 constexpr можно использовать так, как показано в ответе KerrekSB, так что теперь это третий способ. :-)   -  person Cheers and hth. - Alf    schedule 09.12.2011
comment
@Cheersandhth.-Alf constexpr, похоже, не помогает, если вы хотите иметь ссылку на статический член (что может быть необходимо при переходе к функции, которая принимает param как const ref) - однако, если вы хотите constexpr и сохраните его в заголовке и иметь возможность ссылаться на него, я думаю, ваш трюк с фиктивным шаблоном (который, если я правильно понял, является просто способом обойти ODR) просто с добавленным constexpr должен сделать это...   -  person leemes    schedule 02.07.2014
comment
(например, здесь: ideone.com/Q4JU5R)   -  person leemes    schedule 02.07.2014


Ответы (3)


В C++11 у вас могут быть нецелочисленные константные выражения благодаря constexpr:

private:
    static constexpr double some_double = 1.0;
person Kerrek SB    schedule 09.12.2011
comment
Это больше, чем просто сбивает с толку! Что constexpr делает такого, чего не может const? Если constexpr разрешено, почему const не подразумевает constexpr? Похоже, что C++ ломает свой собственный исторический дизайн. - person curiousguy; 09.12.2011
comment
const не означает constexpr. constexpr подразумевает const. constexpr строже, чем const. Учтите, что const auto seed = clock();, seed — это константная переменная (ее значение нельзя будет изменить позже), но это не константное выражение (его нельзя было бы использовать для определения размера массива, если бы он был итегральным). constexpr предназначен для выражения различия между определением времени компиляции и времени выполнения, где const больше относится к интерфейсу и/или спецификатору привилегий доступа. - person John; 24.04.2014
comment
@John: Это примерно так, но это более тонко: constexpr функции-члены не должны автоматически быть const, но это исправлено только в C++ 14. - person Kerrek SB; 24.04.2014
comment
Это не обязательно работает, см.: stackoverflow.com/questions/8452952/ - person Eloff; 04.02.2016
comment
@Eloff: Это не противоречие. Если вы используете переменную odr, вы должны определить ее, но это не мешает вам иметь постоянное выражение. - person Kerrek SB; 04.02.2016

Объявите его в заголовке и инициализируйте в одной единице компиляции (разумно использовать .cpp для класса).

//my_class.hpp
private:
static const double some_double;

//my_class.cpp
const double my_class::some_double = 1.0;
person twsaef    schedule 09.12.2011
comment
Если это ответ, то это дублирующий вопрос. - person Ziggy; 09.12.2011

Я работал над этой проблемой, делая следующее:

//my_class.hpp
const double my_double() const {return 0.12345;}

//in use
double some_double = my_class::my_double();

я получил идею от

math::pi()
person covstat    schedule 09.12.2011
comment
const double my_double() Обнять? почему const? - person curiousguy; 09.12.2011
comment
const для значения, возвращаемого функцией, действительно бессмысленно, но в остальном это был надежный вариант до появления constexpr. - person underscore_d; 12.08.2016