Добрый вечер васмовцы! В Джессе Либерти прочитал, что ситуация: static const bl_s = 5; int main() { ..... } Была осуждена комитетом стандартизации. Но человек на днях мне присал исходник в котором, произошло подобное этому действие, а сделал он следущее: 1. Определил класс 2. В котором определил такую константу В последствии он использует эту константу при создании массива. Но тут то, при компиляции MS visual c++ v6.0, появляется ошибка: "d:\codded\visual_cpp\bla\bla.hpp(64) : error C2258: illegal pure syntax, must be '= 0'" жму на эту строку у меня выводит как раз таки на определение этой константы. Теперь же я думаю,как мне лучше решить просто убрать переменную bl_s за ключ.слово private или же можно по другому? При чем человек утверждает, что его компилятор код компилит!!! p.s.: если кому не влом, разъясните плиз, почему не рекомендуется так творить?
BUG: C2258 and C2252 on in Place Initialization of Static Const Members SYMPTOMS You may get the following error message if you try to perform in-place initialization of static const integral member data. Код (Text): error C2258: illegal pure syntax, must be '= 0' error C2252: 'x' : pure specifier can only be specified for functions RESOLUTION Use one of the following Resolutions: Use enum instead of static const int: Код (Text): enum{x = 3}; Instantiate the member outside the class: Код (Text): const int A::x=3; STATUS Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
aravar Порекомендовать ничего не могу Сам использую большей частью компилятор MSVC 7.1 (он бесплатный, если интересует размер кода, то конкурентов ему практически нет). Или Intel С++ 8.1. Аfaik стандарту больше соответствует GCC. С DEV C++, кстати, идёт старая версия MinGW - это его порт. Borland C++ и MSVC 6 - это не С++ компиляторы ! EvilsInterrupt iron_nomad - вы братья? - нет, мы однофамильцы!
S_T_A_S_ ты кажется не часто читаешь форум иначе бы видел картинку, которую предоставил в одной из тем Coptain_cobalt так вроде пишется ник, ну если че сорри
iron_nomad, вот такая конструкция : class x{ static int i=10; } не может иметь место ни в одном из компиляторов. Причина - приравнивание в декларации класса применимо только к определению абстрактных функций (pure virtual). И естественно определение асбтрактной функции выглядит - void foo()=0; Это единственное возможное использование присваивания в декларации класса. И оно всегда должно быть функция = 0. Ни функция=2 ни 3 ни что-либо ещё. только функция=0; Идем дальше. Касательно статиков. Их инициализировать можно в другой единице компиляции. Т.е. к примеру : у тебя есть хидер foo.h и сорс foo.cpp при этом в хидере foo.h у тебя определние класса foo, а в сорсе - реализация. Соответсвенно вот тебе простой пример использования статиков в классе : foo.h: class foo{ public: static int i; } foo.cpp: #include "foo.h" foo:i=10; Это фактически единственный вариант инициализации статических переменных. В конструкторах\других функциях инициализировать их нельзя. Т.к. инициализация будет происходить при создании каждого объекта. Скажем так - фактически можно, но глупо. Я сказал.
rst > Изначально (хотя, к сожалению, это никак не видно со слов автора трэда) речь шла о таком коде: Код (Text): class x{ static [b]const[/b] int i=10; } Хотя, msvc почему-то позволяет и твой вариант. letopisec > Что бы не использовать препроцессор.
S_T_A_S_ Объвите, если не трудно случаи когда работы препроцессора можно избежать, и если есть силы стучать по клаве пальцами, то буду рад и коду!
S_T_A_S_ Изначально (хотя, к сожалению, это никак не видно со слов автора трэда) речь шла о таком коде: class x{ static const int i=10; } Эта запись так же является абсурдной. По той причине, что все константы - инициализируются в списке инициализаций. т.е. class foo{ foo(); } foo::foo():i=10 { } Но никак не в декларации класса. Хотя, кстати исходя из того, что там используется static const - я не совсем представляю как _более_ правильно её инициализировать. Но опять же, резюме - присваивание в декларации класса возможно только для определения абстрактных функций.
rst На сколько я понимаю, смысл static const в С++ - избавиться от определения констант посредством препроцессора (#define). Если делать присваивание в конструкторе - будет выделяться память под эту константу. Но константу можно скомпилировать в непосредственный операнд ассемблерной инструкции (и нормальный С++ компилятор должен это делать, если только нигде не используется ссылка на эту константу). Можно использовать enum (опять же, присваивание будет в декларации класса). Но как static const можно определять любой базовый тип и получить проверку типов на этапе компиляции. И вот что говорит ISO/IEC14882 (нового у меня нет):
S_T_A_S_ насчет статиков - они всегда создаются на этапе компиляции в экзешнике. В случае классов - они не инстанциируются при создании класса, они всегда определены в суперклассе. Т.е. при присваивании - не будет выделяться память. Т.к. она уже выделена. В случае использования шаблонов - тоже самое. Т.к. шаблон генерируется на этапе компиляции.
А вот насчет того - можно ли или нельзя в декларации класса присваивание статикам делать - это имхо up to microsoft. Т.к. в микрософтовском компилере точно нельзя. В других возможно по-другому.
Happily, you don't have to care about any of this anymore. Fairly late in the standardization game, the C++ standards committee patched the C++ standard to let static integer constants be initialized in their declarations: Код (Text): class X { public: static int const n = 10; // initialization OK void f2() { int a[X::n]; // OK } }; int const X::n = 10; // now an error -- multiple initialization int const X::n; // definition OK, but might not be required Visual C++ .NET compiles this properly. Visual C++ 6.0 interprets the initialization of X::n as an illegal pure virtual function declaration. Источник: cl.exe Episode XIII: Attack of the Standards - Bobby Schmidt. Microsoft Corporation