我有以下看似无害的代码:
#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'
我在这里做错了什么?
答案 0 :(得分:18)
追踪此类错误的一种方法是从头开始:
#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到你的文件路径/ 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'
就是这样。因此,在文件路径/ ui.h之前#include的其他一些头文件具有格式错误的类声明。
<强>附录强>
有时使用不同的编译器会有所帮助。 g ++以其对这种常见编程错误的不良处理而臭名昭着。用clang编译上面的结果
testmain.cpp:4:2: error: expected ';' after struct
所以,tada,clang已经把注意力集中在这个问题上。
正在发生的事情是,当编译器遇到问题时,它会对您的代码应用一些修复程序,以使其语法正确。编译器错误消息基于此自动更正。注意:这种自动更正通常是一件非常好的事情。没有它,编译器必须在第一个错误时关闭。由于程序员不可避免地会犯一个以上的错误,一次一个地追捕它们将是后方的痛苦。
除了不添加明显缺失的分号之外,我还没有最愚蠢的想法来解决丢失的分号问题。 clang添加了缺少的分号,这就是它所抱怨的。
答案 1 :(得分:1)
此文件包含在哪里。这个文件没什么问题
你发布了;我怀疑发生的是包含的文件
它已经包含<string>
(所以这包括什么都不做),和
在包含您的文件之前错过;
。
答案 2 :(得分:1)
#pragma曾经发生同样的事情(假设您的编译器支持它)?
您是否真的将文件配对,以便所有其他代码都被注释掉了?
(为发布更多问题而非答案而道歉)
答案 3 :(得分:1)
我是通过Google搜索到达这里的。如果有人因相同的错误而在此页面上登陆,则尝试在类范围内定义名称空间别名时也会出现此错误。
示例:
namespace SomeLongNamespaceName { }
class SomeClass {
namespace X = SomeLongNamespaceName; // This is illegal and will give the
// compiler error from this question
};
可在此处获取更多信息: C++ namespace alias in entire class scope
答案 4 :(得分:-1)
“名称”是一个错误。预期:“命名空间”前的unqualified-id
文件顶部标头之一中的类声明中的名称空间。因此,我需要在最后的'}'
之后添加多余的分号。这样,'};;;;'
就可以了。