разрешение области действия — Почему C ++ не позволяет const после ::?

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: недопустимый токен в правой части ‘::’
}

-2

Решение

Когда вы берете свой макрос:

#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;
};

Лучше всего просто покончить с макросом, а затем модифицировать ваш код, чтобы использовать правильные константы, как вы пытаетесь сделать здесь. Не смешивать и сочетать. По крайней мере, не используйте то же имя для члена, что и для макроса.

12

Другие решения

Прежде всего ваш класс называется Aкак в столице Aне a, Имя класса используется для определения константы, которую вы пытаетесь использовать. Итак, измените свой код для использования A::CONST, Кстати, это C ++, а не C # или Java, так что нет такой вещи, как IntЕсли только по какой-то странной причине вы не решили изобрести свой собственный целочисленный тип.

Кроме того, использование всех заглавных букв для именования констант может конфликтовать с макросами и является хорошим способом решения проблем, тем более что предварительная обработка происходит в первую очередь, а макросы заменяются на все случаи констант. Это часто может привести к неверному коду C ++ с синтаксическими ошибками, которые трудно понять. Вот почему вы никогда не должны использовать все прописные буквы для именования констант, так как это соглашение чаще всего используется для макросов.

6

Если я могу сделать предположение, похоже, что вы пытаетесь использовать :: так же, как вы используете . в Python.

Похоже, вы действительно не понимаете, что делает оператор разрешения области действия или как он работает.

:: имеет очень специфическое и довольно ограниченное использование. Пока вы не поймете это лучше, нам будет очень трудно помогать вам.

0
По вопросам рекламы [email protected]