Объявление констант через extern

219
26 ноября 2016, 19:02

Вылезает ошибка при объявлении константы:

warning C4459: объявление "speedRange" скрывает глобальное объявление

В заголовочном файле находится:

typedef std::pair<int, int> Speed;
typedef std::map<Gear, Speed> SpeedRange;
extern const SpeedRange speedRange;

А в CPP

const SpeedRange speedRange = {
    { Gear::REVERSE, Speed(0, 20) },
    { Gear::NEUTRAL_GEAR, Speed(MIN_SPEED, MAX_SPEED) },
    { Gear::FIRST_GEAR, Speed(0, 30) },
    { Gear::SECOND_GEAR, Speed(20, 50) },
    { Gear::THIRD_GEAR, Speed(30, 60) },
    { Gear::FOURTH_GEAR, Speed(40, 90) },
    { Gear::FIFTH_GEAR, Speed(50, 150) }
};
Answer 1

Напишите как

extern const SpeedRange speedRange = {
//...

По умолчанию константы имеют внутреннее связывание, а потому без ключевого слова extern данное объявление считается объявлением с внутренним связыванием и скрывает одноименное объявление с внешним связыванием, присутствующее в заголовке (который вы, возможно, забыли включить. Проверьте, включен ли заголовок в этот модуль).

Из стандарта C++ (3.5 Program and linkage)

— a variable that is explicitly declared const or constexpr and neither explicitly declared extern nor previously declared to have external linkage; or

Либо ваше определение константы находится в каком-нибудь блоке кода, а не в глобальном пространстве имен, в результате чего оно скрывает глобальное объявление.

READ ALSO
Указатель на массив C++

Указатель на массив C++

Пусть имеем статический массив:

203
проблема в указателях

проблема в указателях

здравствуйте, пишу односвязный список, вот кусок:

195
Простейшая задача на алгоритмизацию и SIGSEGV

Простейшая задача на алгоритмизацию и SIGSEGV

Есть простейшая задача: Найти k-ое простое число

187
Разбор рекурсии числа ряда Фибоначчи

Разбор рекурсии числа ряда Фибоначчи

Добрый вечерНе могу понять действия рекурсивной функции при нахождении числа Фибоначчи

245