Ошибка «Ожидаемый неквалифицированный идентификатор перед« пространством имен »» - PullRequest
8 голосов
/ 16 августа 2011

У меня есть следующий, казалось бы, безобидный кусок кода:

#ifndef UI_H
#define UI_H

#include <string>

namespace ui
{
    //Displays the main menu, showing loaded vocabulary cards
    //
    //Returns upon completion of display
    void displayMainMenu();

    //...More code like the above, just comments followed by functions
}

#endif

, который дает мне это сообщение об ошибке:

filepath/ui.h:6: error: expected unqualified-id before 'namespace'

Что я здесь не так делаю?

Ответы [ 3 ]

18 голосов
/ 16 августа 2011

Один из способов отследить такие ошибки - начать с нуля:

#include "filepath/ui.h"
int main () { return 0; }

Это компилируется?(Это хорошо работает с небольшим фрагментом ui.h, который вы предоставили.)

Подобные ошибки часто бывают вызваны отсутствующей точкой с запятой в каком-либо предыдущем объявлении класса.Итак, давайте попробуем форсировать проблему:

struct Foo { int foo; } // Note the missing semicolon after the close brace.

#include "filepath/ui.h"
int main () { return 0; }

Это, конечно, не компилируется чисто.Я получаю запутанную трассировку пути включения из моего testmain.cpp в ваш filepath / ui.h в строку ... и в итоге получаю

/usr/include/i386/_types.h:37: error: two or more data types in declaration of '__int8_t'

Так что это не ошибка, но пропущенная точка с запятой навернякасоздавая беспорядок.Ваша ошибка не возникает глубоко в недрах <string>, поэтому давайте сделаем нашу тестовую программу #include <string> перед попыткой воссоздать ошибку:

#include <string>
struct Foo { int foo; } // Note the missing semicolon after the close brace.

#include "filepath/ui.h"
int main () { return 0; }

И сообщение об ошибке будет

In file included from testmain.cpp:5:
filepath/ui.h:6: error: expected unqualified-id before 'namespace'

И вот оно.Поэтому некоторые другие заголовки, которые вы #include перед filepath / ui.h, имеют неправильно сформированное объявление класса.

Приложение
Иногда это помогает использовать другой компилятор.g ++ печально известен своей плохой обработкой этой распространенной ошибки программирования.Компиляция вышеупомянутого с выходом clang

testmain.cpp:4:2: error: expected ';' after struct

Итак, tada, clang сосредоточился на проблеме.

Что происходит, когда компилятор сталкивается с проблемой, он применяет некоторые исправления к вашемукод, чтобы сделать его грамматически правильным.Сообщение об ошибке компилятора основано на этой автокоррекции.Обратите внимание: эта автокоррекция вообще очень хорошая вещь.Без этого компилятор обязательно должен был бы завершить работу при первой ошибке.Так как программисты неизбежно допускают более одной ошибки, выискивать их по одной за раз было бы неприятно.

Я не имею ни малейшего представления, что глупая коррекция g ++ применяется для исправления проблемы пропущенной точки с запятой, другиечем не добавить очевидную пропущенную точку с запятой.clang добавляет пропущенную точку с запятой, и это то, на что он жалуется.

1 голос
/ 16 августа 2011

Ну, это странно.Есть что-нибудь еще #defined UI_H (который не должен вызывать проблем, но кто знает), или пользовательский интерфейс?

То же самое происходит с #pragma один раз (если ваш компилятор это поддерживает)?

Вы буквально спарили файл так, чтобы весь другой код был закомментирован?

(извинения за публикацию большего количества вопросов, а не ответов)

1 голос
/ 16 августа 2011

Откуда этот файл включен.Нет ничего плохого в файле, который вы разместили;Я подозреваю, что происходит, что файл, который включает в себя, уже включает <string> (так что это включает ничего не делает), и пропускает ; непосредственно перед включением вашего файла.

...