Folks,
Постановка проблемы — Позволяет ли C ++ (статический) const быть ограниченным областью действия класса, чтобы я мог избавиться от #defines, которые загрязняют все пространство имен?
Мое наблюдение НЕТ (в следующих РАЗНЫХ примерах), и Я хотел бы узнать, почему и какова лучшая альтернатива. VS генерирует ошибку C2589: «const»: недопустимый токен с правой стороны от «::»
// a.h
класс А
{
…
..
static const uint_32 myConst = 1234;
};
//b.cpp
…
В ()
{
uint32_t arr [A :: myConst]; // C2589! const: недопустимый токен в правой части ‘::’
}
// a.h
класс А
{
…
..
Enum Blah
{
…
myConst = 1234,
..
};
};
//b.cpp
…
В ()
{
uint32_t arr [A :: myConst]; // C2589! const: недопустимый токен в правой части ‘::’
}
Когда вы берете свой макрос:
#define CONST 1234
и замените его тем, где вы его используете:
static const int CONST = 1234;
Конечный результат — чепуха
static const int 1234 = 1234;
В другом случае:
Int a1[a::CONST];
Это также становится глупостью:
Int a1[a::1234];
Это все напрашивается вопрос, что ты пытаясь сделать?
Похоже, вы пытаетесь создать переменную-член с тем же именем, что и ваш макрос, CONST
, Вот:
class A
{
static const int CONST = 1234;
};
Однако, поскольку, когда этот код скомпилирован, макрос уже был определен, препроцессор меняет его, подставляя макрос до того, как сам компилятор сможет его взломать. Ко времени компиляции кода это выглядит так:
class A
{
static const int 1234 = 1234;
};
Лучше всего просто покончить с макросом, а затем модифицировать ваш код, чтобы использовать правильные константы, как вы пытаетесь сделать здесь. Не смешивать и сочетать. По крайней мере, не используйте то же имя для члена, что и для макроса.
Прежде всего ваш класс называется A
как в столице A
не a
, Имя класса используется для определения константы, которую вы пытаетесь использовать. Итак, измените свой код для использования A::CONST
, Кстати, это C ++, а не C # или Java, так что нет такой вещи, как Int
Если только по какой-то странной причине вы не решили изобрести свой собственный целочисленный тип.
Кроме того, использование всех заглавных букв для именования констант может конфликтовать с макросами и является хорошим способом решения проблем, тем более что предварительная обработка происходит в первую очередь, а макросы заменяются на все случаи констант. Это часто может привести к неверному коду C ++ с синтаксическими ошибками, которые трудно понять. Вот почему вы никогда не должны использовать все прописные буквы для именования констант, так как это соглашение чаще всего используется для макросов.
Если я могу сделать предположение, похоже, что вы пытаетесь использовать ::
так же, как вы используете .
в Python.
Похоже, вы действительно не понимаете, что делает оператор разрешения области действия или как он работает.
::
имеет очень специфическое и довольно ограниченное использование. Пока вы не поймете это лучше, нам будет очень трудно помогать вам.