Не называет ошибку типа из-за существующего перечисления, но почему?

Я только что получил эту ошибку: «ошибка:« Символ »не называет тип»

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

class Symbol{int dummy;};
//class Symbol{int again;};
Symbol global_symbol;

Это дает «ошибку:‘ Symbol »не называет тип» для 3-й строки. Если я раскомментирую 2-ю строку, я все равно получаю ту же ошибку, но прямо перед ней я получаю: «ошибка: переопределение« символа класса »» !!

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

Но меня смущает то, что я не получил ошибку class Symbol{} линия? Если он вступает в противоречие с перечислением, если я никогда не смогу создать экземпляр этого класса, почему он не пожаловался? Я чувствую, что либо пропускаю флаг g++или в моих знаниях C ++ есть пробел. Я готов к тому, что кто-то скажет мне, что это особенность, а не ошибка.

(Кстати, я использую g++ -c -std=gnu++0x -Wall -g -Werror ... и g ++ 4.8.1)

2

Решение

То, что вы видите, является формой сокрытие имени: объявление переменной или функции Symbol будет найден в предпочтении class Symbol ([basic.scope.hiding] §3.3.10 / 2). В случаях, когда C ++ позволяет одному объявлению скрывать другое в той же области, всегда есть уточненный тип Спецификатор который по-прежнему относится к скрытой декларации. Они так названы, потому что только тип (class или же enum) может быть скрыт таким образом; typedefs и шаблоны не могут. Порядок декларирования не имеет значения.

В этом случае вы можете использовать class Symbol для ссылки на класс, когда переменная или функция находится в области видимости:

class Symbol global_symbol;
2

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

gcc Сообщения об ошибках не являются наиболее удобными для пользователя, из-за того, что C++ имеет довольно сложный синтаксис, и синтаксический анализатор иногда полностью запутывается из-за малейшей ошибки, такой как отсутствие ;, Например, ваш код формы

enum A{Symbol=0};

class Symbol{int dummy;};

int main()
{
Symbol global_symbol;
}

где enum иметь Symbol объявлен до class Symbol дает мне следующую ошибку компиляции (я использую g++4.8):

minimal.cpp: In function 'int main()':
minimal.cpp:13:9: error: expected ';' before 'global_symbol'
Symbol global_symbol;
^
minimal.cpp:13:22: warning: statement has no effect [-Wunused-value]
Symbol global_symbol;

Поэтому лучше всего использовать пространства имен в вашем коде или изменить имя класса 🙂
И вы упомянули, что использовали g++2.8, Вы имели в виду 2.8 или же 4.8? 2.8 довольно старинный (16 лет), так что даже не полностью C++98 совместимый.

2

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