Заблокирован

Почему нельзя объявить в описание класса статический double?

02.10.2014, 16:19. Показов 6927. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ближе к делу
C++
1
2
3
4
5
6
7
8
class SuperClass
{
public:
    SuperClass() {}
 
    static const int A = 0;
    static const double B = 0; //ERROR*
};
ERROR*:
error C2864: 'SuperClass::B' : a static data member with an in-class initializer must have non-volatile const integral type
Собственно почему? Я не очень понял выпендрёжа компилятора по поводу volatile ...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2014, 16:19
Ответы с готовыми решениями:

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void Method() Необходимо при нажатии на...

Как объявить статический метод класса?
выдает ошибку на 11 16 19 строку((((((( #include <iostream> using namespace std; class Sop { private: short int kol; ...

Почему нельзя объявить динамический массив глобально
вот код #include <iostream> #include <string> int w = 0; string *s = new string ; using namespace std; int main { ...

25
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.10.2014, 18:19
Студворк — интернет-сервис помощи студентам
Scrooge McDuck, читаем про constexpr
its type must be a LiteralType
Добавлено через 2 минуты
Компилятор должен поддерживать С++11.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2014, 18:22
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
нет, ну не объяснение конечно же, но может хоть утверждение или декларация (или на самом деле, почему) того, что только Int и enum может объявляться статический в объявление класса с присваиванием значением, а другие переменные - нет
В стандарте есть, это точно (не в С++11, там, насколько знаю, все поля в объявлении класса можно инициализировать), лень искать.
1
Заблокирован
02.10.2014, 18:24  [ТС]
Ладно, проехали
Всем спасибо
0
Pied Piper
 Аватар для ArmanPrestige
237 / 228 / 57
Регистрация: 15.01.2013
Сообщений: 855
02.10.2014, 18:33
Цитата Сообщение от alsav22 Посмотреть сообщение
В стандарте есть, это точно (не в С++11, там, насколько знаю, все поля в объявлении класса можно инициализировать), лень искать.
Подтверждаю. Компилятор который в 2012 студии меня посылал - не полностью еще стандарт поддерживается. А вот gcc 4.8.1 - все прекрасно работает.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2014, 18:45
Лучший ответ Сообщение было отмечено Scrooge McDuck как решение

Решение

Scrooge McDuck, вот: 9.4.2 4 (C++98):
If a static data member is of const integral or const enumeration type, its declaration in the class
definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
scope if it is used in the program and the namespace scope definition shall not contain an initializer.
1
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
02.10.2014, 19:46
Лучший ответ Сообщение было отмечено Scrooge McDuck как решение

Решение

Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Эти члены доступны только через класс - SuperClass::A, они не глобальные
Они не глобальные, но имеют static storage duration, а значит инициализируются в начале работы программы, а уничтожаются в конце. Точно так же себя ведут глобальные переменные, потому что они тоже имеют static storage duration. Он скорее всего именно это имел в виду.

Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Ну понятно, это я и так знал, просто хотелось узнать, почему только Int и перечисление? Чем double хуже Int ?
Сайт Бьярне:
A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects.
Этот текст написан уже давно, теперь constexpr решает эту проблему путем разделения кода выполняемого на этапе компиляции, и кода работающего на этапе исполнения. Раньше такого разделения не было. Очевидно, что для кода этапа компиляции нет необходимости иметь definition, поэтому выделенное выше не противоречит подходу с constexpr.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2014, 19:46

Почему нельзя объявить указатель на шаблонную структуру?
template <class T> typedef struct per { T znach; int kol_vo_povt; }* p; int main() { per<int> k; }

Почему нельзя объявить интерфейс во внутреннем классе?
Почему нельзя объявить интерфейс во внутреннем классе? Здесь написано: Я не понимаю, почему будет добавлен модификатор static?

Почему нельзя так объявить двумерный массив?
Ошибка возникает если для массива tempArray при объявлении(и одновременной инициализации) использовать переменную(size) которую принимает...

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов
Возникли сложности при решении задачи. Буду признателен тем, кто поможет. Задание: Составить описание класса. Объявить объекты класса...

Почему нельзя делить с остатком float/double
Доброго времени суток, объясните мне, почему нельзя делить с остатком числа с точкой? К примеру 5.5 / 2 = 1.5, разве нет? Проверим,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru