“'命名空间'之前的预期不合格ID”错误

时间:2011-08-16 08:24:15

标签: c++ debugging namespaces

我有以下看似无害的代码:

#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'

我在这里做错了什么?

5 个答案:

答案 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)

嗯,这很奇怪。还有什么#defined UI_H(不应该导致问题,但谁知道),或者ui?

#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 文件顶部标头之一中的类声明中的名称空间。因此,我需要在最后的'}'之后添加多余的分号。这样,'};;;;'就可以了。